par(pch=20, cex=.6)
pten1_data <- read.delim('~/leklab/leklab/pten1.txt')
pten1_proc <- pten1_data[!is.na(pten1_data$abundance_class),]
dd <- data.frame(pten1_proc$abundance_class,pten1_proc$score)
colnames(dd) <- c("abundance_class", "score")
tpmt1_data <- read.delim('~/leklab/leklab/tpmt_suppl_2.txt')
tpmt1_proc <- tpmt1_data[!is.na(tpmt1_data$abundance_class),]
ee <- data.frame(tpmt1_proc$abundance_class,tpmt1_proc$score)
colnames(ee) <- c("abundance_class", "score")
dd$protein <- rep("PTEN", nrow(dd))
ee$protein <- rep("TPMT", nrow(ee))
ff = data.frame(rbind(dd, ee))
bbpp = boxplot(score~protein+abundance_class, data = ff, at = c(1, 1.8, 3, 3.8, 5, 5.8, 7.2, 8), xaxt='n', col = c('white', 'gray'))
axis(side=1, at=c(1.4, 3.4, 5.4, 7.6), labels=c('low', 'possibly low', 'possibly\n wt-like', 'wt-like'))
title('VAMP-seq scores of PTEN and TPMT Variants\nand abundance class')

#plot(x = pten1_proc$abundance_class, y = pten1_proc$score,type='p', main = "PTEN", xlab = "Abundance", ylab = "VAMP-seq score", col="#74ABD6")
#points(x = tpmt1_proc$abundance_class, y = tpmt1_proc$score, type='p', col = "#ADDFAD")
library(reshape2)
# d <- read.table(text = "col_a col_b
# aa 1
# ba 1.25
# ba 1
# ba 1.25
# ca 1.3
# ca 1.25
# da 1.5
# da 1.25
# aa 1.7
# ca 1.25
# ba 1.2
# da 1.25
# aa 1.4
# aa 1.25
# ca 1.1
# aa 1.25",
# header = TRUE,)
# e <- read.table(text = "col_a col_b
# aa 1.6
# aa 1.55
# ba 1.2
# ba 1.45
# ca 1.8
# ca 1.55
# da 1.5
# da 1.35
# aa 1.9
# ca 1.75
# ba 1.25
# da 1.55
# aa 1.45
# aa 1.5
# ca 1.3
# aa 1.75",
# header = TRUE,)
# d$label <- rep(1, nrow(d))
# e$label <- rep(2, nrow(e))
# f = data.frame(rbind(d, e))
# ##f$col_a = pollutant
# ##f$label = location
# bp = boxplot(col_b~label+col_a, data = f, at = c(1, 1.8, 3, 3.8, 5, 5.8, 7.2, 8), xaxt='n', ylim = c(.9, 1.9), col = c('white', 'gray'))
# axis(side=1, at=c(1.4, 3.4, 5.4, 7.6), labels=c('aa', 'ba', 'ca', 'da'), title('practice'))
#plots VAMP-seq score vs abundance_class
library(ggplot2)
require(gridExtra)
Loading required package: gridExtra
VAMP_abundance <- ggplot(ff, aes(x=abundance_class, y=score, fill=protein)) + geom_violin(draw_quantiles = 0.5)+ylab("VAMP-seq score")+xlab("Abundance Class")+theme(legend.title=element_blank(), panel.grid.major = element_line(colour = "grey"), panel.grid.minor = element_line(colour = "grey"))+ggtitle("VAMP-seq scores for each abundance classification")+geom_point(data=data.frame(x="wt-like", y=1, protein = "PTEN"), aes(x,y), colour="black", size=1.5, show.legend=FALSE)+annotate("text", x = "wt-like", y=1.09, label = "WT",colour= "black", size = 4) + scale_y_continuous(minor_breaks = seq(-2, 2, .25))
plot(VAMP_abundance)

#plots helix vs score for PTEN
ggplot(pten1_data, aes(x=as.factor(helix), y=score)) + geom_boxplot()+ylab("VAMP-seq score")

#combining pten1_data and tpmt1_data into one large data frame, differentiate between the two w/ column 'protein' which specifies 'PTEN' or 'TPMT'
pten1_data$protein <- rep("PTEN", nrow(pten1_data))
tpmt1_data$protein <- rep("TPMT", nrow(tpmt1_data))
common_cols <- intersect(colnames(pten1_data), colnames(tpmt1_data))
comb_data = rbind(subset(pten1_data, select = common_cols), subset(tpmt1_data, select = common_cols))
#plots helix vs score for PTEN and TPMT side by side
#no NA
comb_data_helix <- comb_data[!is.na(comb_data$helix),]
#check to see where 3759 rows went off to
ck <- comb_data_helix[!is.na(comb_data_helix$abundance_class),]
comb_data_sheet <- comb_data[!is.na(comb_data$sheet),]
ck1 <- comb_data_sheet[!is.na(comb_data_sheet$abundance_class),]
h_plot <- ggplot(ck, aes(x=as.factor(helix), y=score, fill=protein)) + geom_violin(data=subset(ck, helix==1), draw_quantiles = c(0.5)) + guides(fill=FALSE) + xlab("Alpha Helix") + ylab("VAMP-seq score") + theme(axis.text.x = element_blank()) + scale_y_continuous(limits = c(-.7, 2.03))
s_plot <- ggplot(ck1, aes(x=as.factor(sheet), y=score, fill=protein)) + geom_violin(data=subset(ck1, sheet==1), draw_quantiles = c(0.5)) + theme(axis.title.y = element_blank(), axis.text.y = element_blank(), axis.text.x = element_blank()) + xlab("Beta Sheet") + scale_y_continuous(limits = c(-.7, 2.03)) + guides(fill=FALSE)
n_plot <- ggplot(ck, aes(x=as.factor(helix), y=score, fill=protein)) + geom_violin(data=subset(ck, helix==0 & sheet==0), draw_quantiles = c( 0.5)) + theme( axis.title.y = element_blank(), axis.text.y = element_blank(), axis.text.x = element_blank(), legend.justification=c(1,0), legend.position=c(.49,.75), legend.title=element_blank(), legend.text = element_text(size=10)) + xlab("Other") + scale_y_continuous(limits = c(-.7, 2.03))
#put the plots side by side
combined <- grid.arrange(h_plot, s_plot, n_plot, ncol=3, top = "Variant scores in relation to position in protein")

##############
##save as pdf
# pdf("violin_Variant_scores_vs.pdf")
# plot(combined)
# plot(VAMP_abundance)
# dev.off()
##############
#works to save single
#ggsave("Variant_scores_protein_position.pdf", plot = combined, device = "pdf", path = "/Users/go2alyssa/Desktop/", scale = 2.6, dpi = "retina")
library(pracma)
# graph VAMP-seq scores relative to variant position in protein
#pten
pten1_proc_wt <- pten1_proc[!is.na(pten1_proc$position),]
pten1_proc_wt$secondary_struct <- ifelse(is.na(pten1_proc_wt$helix), "unknown",
ifelse(pten1_proc_wt$helix==1, "helix",
ifelse(pten1_proc_wt$sheet==1, "sheet",
ifelse(pten1_proc_wt$helix==0, "neither",
"unknown"))))
pten_pos <- ggplot(pten1_proc_wt, aes(x=position, y=score, colour=secondary_struct))+ geom_point(size=.3) + scale_x_continuous(minor_breaks = seq(0, 420, 5)) + scale_color_manual(values=c("#FF4848", "#00C853", "#5757FF", "#A9A9A9")) +ylab("VAMP-seq score")+xlab("Position in PTEN")+labs(colour="Secondary Structure")+ggtitle("PTEN scores in relation to protein structure") + geom_vline(xintercept=27, color="black", size=.1) + geom_vline(xintercept=55, color="black", size=.1) + geom_vline(xintercept=70, color="black", size=.1) + geom_vline(xintercept=85, color="black", size=.1) + geom_vline(xintercept=164.5, color="black", size=.1) + geom_vline(xintercept=212, color="black", size=.1) + geom_vline(xintercept=267.5, color="black", size=.1) + geom_vline(xintercept=343.5, color="black", size=.1)
#tpmt
tpmt1_proc_wt <- tpmt1_proc[!is.na(tpmt1_proc$position),]
tpmt1_proc_wt$secondary_struct <- ifelse(is.na(tpmt1_proc_wt$helix), "unknown",
ifelse(tpmt1_proc_wt$helix==1, "helix",
ifelse(tpmt1_proc_wt$sheet==1, "sheet",
ifelse(tpmt1_proc_wt$helix==0, "neither",
"unknown"))))
tpmt_pos <- ggplot(tpmt1_proc_wt, aes(x=position, y=score, colour=secondary_struct))+ geom_point(size=.3) + scale_x_continuous(minor_breaks = seq(0, 405, 5)) + scale_color_manual(values=c("#FF4848", "#00C853", "#5757FF", "#A9A9A9")) +ylab("VAMP-seq score")+xlab("Position in TPMT")+labs(colour="Secondary Structure")+ggtitle("TPMT scores in relation to protein structure") + geom_vline(xintercept=47, color="black", size=.1) + geom_vline(xintercept=78, color="black", size=.1) + geom_vline(xintercept=122.5, color="black", size=.1) + geom_vline(xintercept=140, color="black", size=.1) + geom_vline(xintercept=165, color="black", size=.1) + geom_vline(xintercept=194, color="black", size=.1) + geom_vline(xintercept=209, color="black", size=.1)
tpmt_colors <- tpmt1_proc_wt
#[order(position, variant),]
tpmt_colors$fact <- rep(10, nrow(tpmt_colors))
temp <- 1
for(i in 1:(length(tpmt_colors$fact)-1)) {
if (tpmt_colors$secondary_struct[i] != tpmt_colors$secondary_struct[i+1]) {
tpmt_colors$fact[i] <- temp
temp <- temp + 1
} else {
tpmt_colors$fact[i] <- temp
}
}
tpmt_colors$fact[length(tpmt_colors$fact)] <- temp
# cc <- 0
# for(i in 1:(length(tpmt_colors$fact)-1)) {
# if (tpmt_colors$fact[i] != tpmt_colors$fact[i+1]) {
# print(cc)
# cc <- 0
# } else {
# cc <- cc + 1
# }
# }
tpmt_pos_vp <- ggplot(tpmt_colors, aes(x=position, y=score))+ geom_violin(data=tpmt_colors[c(1:2783, 2798:4000),], aes(fill=as.character(fact), colour = factor(TRUE)), draw_quantiles = c(0.5), scale = "width") +
scale_fill_manual(values=c("1" = "#A9A9A9", "2" = "#00C853", "3" = "#FF4848", "4" = "#00C853","5" = "#FF4848", "6" = "#00C853","7" = "#5757FF", "8" = "#00C853","9" = "#FF4848","10" = "#00C853","11" = "#5757FF", "12" = "#00C853","13" = "#FF4848", "14" = "#00C853", "15" = "#5757FF", "16" = "#00C853", "17" = "#5757FF", "18" = "#00C853", "19" = "#5757FF", "20" = "#00C853", "21" = "#5757FF", "22" = "#00C853", "23" = "#FF4848", "24" = "#5757FF", "25" = "#00C853", "26" = "#FF4848", "27" = "#00C853", "28" = "#5757FF", "29" = "#00C853", "30" = "#5757FF", "31" = "#00C853")) + scale_colour_manual(values = c("black")) + scale_x_continuous(minor_breaks = seq(0, 405, 5)) + ylab("VAMP-seq score")+xlab("Position in TPMT")+labs(colour="Secondary Structure")+ggtitle("TPMT scores in relation to protein structure") + geom_vline(xintercept=47, color="black", size=.1) + geom_vline(xintercept=78, color="black", size=.1) + geom_vline(xintercept=122.5, color="black", size=.1) + geom_vline(xintercept=140, color="black", size=.1) + geom_vline(xintercept=165, color="black", size=.1) + geom_vline(xintercept=194, color="black", size=.1) + geom_vline(xintercept=209, color="black", size=.1)
plot(pten_pos)

plot(tpmt_pos)

plot(tpmt_pos_vp)

# graph VAMP-seq scores relative to variant position in protein
#pten
pten1_hbond <- pten1_proc[!is.na(pten1_proc$hbond_sum),]
pten1_hbond$secondary_struct <- ifelse(is.na(pten1_hbond$helix), "unknown",
ifelse(pten1_hbond$helix==1, "helix",
ifelse(pten1_hbond$sheet==1, "sheet",
ifelse(pten1_hbond$helix==0, "neither",
"unknown"))))
pten_plot_hbond <- ggplot(pten1_hbond, aes(x=hbond_sum, y=score, colour=secondary_struct))+ geom_point(alpha=0.4) + ylab("VAMP-seq score")+xlab("DSSP Sum of hydrogen bonds")+ggtitle("PTEN scores in relation to hydrogen bonding") + scale_color_manual(values=c("#FF4848", "#696969", "#5757FF")) + labs(colour="Secondary Structure")
plot(pten_plot_hbond)

pten_plot_hbond1 <- ggplot(pten1_hbond, aes(x=hbond_sum, y=score))+ geom_point(alpha = 0.2) + ylab("VAMP-seq score")+xlab("DSSP Sum of hydrogen bonds")+ggtitle("PTEN scores in relation to hydrogen bonding")
# was in aes, ggplot function call ---> colour=secondary_struct
#scale_color_manual(values=c("#FF4848", "#00C853", "#5757FF", "#A9A9A9")) + labs(colour="Secondary Structure")+
plot(pten_plot_hbond1)

#store last four
# pdf("position_hydrogen_bonds.pdf")
# plot(pten_pos)
# plot(tpmt_pos)
# plot(pten_plot_hbond)
# plot(pten_plot_hbond1)
# dev.off()
name <- c('Ala', 'Arg', 'Asn', 'Asp', 'Cys', 'Glu', 'Gln', 'Gly', 'His', 'Ile', 'Leu', 'Lys', 'Met', 'Phe', 'Pro', 'Ser', 'Thr', 'Trp', 'Tyr', 'Val')
quality <- c('Hydrophobic', 'Basic', 'Polar Neutral', 'Acidic', 'Polar Neutral', 'Acidic', 'Polar Neutral', 'Glycine', 'Basic', 'Hydrophobic', 'Hydrophobic', 'Basic', 'Hydrophobic', 'Hydrophobic', 'Hydrophobic', 'Polar Neutral', 'Polar Neutral', 'Hydrophobic', 'Hydrophobic', 'Hydrophobic')
#abundance <- get better scale
abundance <- c(0.0884, 0.057, 0.0417, 0.0539, 0.0124, 0.0624, 0.0382, 0.0703, 0.0220, 0.0595, 0.0994, 0.0527, 0.0237, 0.04, 0.0471, 0.0672, 0.0543, 0.0121, 0.03, 0.0677)
#isoelectric point <- unknown source (ncbi)
isoelectric <- c(6, 10.8, 5.4, 3, 5, 3.2, 5.7, 6, 7.6, 6, 6, 9.7, 5.7, 5.5, 6.3, 5.7, 5.6, 5.9, 5.7, 6.0)
hp_k_d <- c(1.8, -4.5, -3.5, -3.5, 2.5, -3.5, -3.5, -0.4, -3.2, 4.5, 3.8, -3.9, 1.9, 2.8, -1.6, -0.8, -0.7, -0.9, -1.3, 4.2)
hp_janin <-c(0.3, -1.4, -0.5, -0.6, 0.9, -0.7, -0.7, 0.3, -0.1, 0.7, 0.5, -1.8, 0.4, 0.5, -0.3, -0.1, -0.2, 0.3, -0.4, 0.6)
#Monera et al., J. Protein Sci (pro (-46) may be sketch)
hp_ph7 <- c(41, -14, -28, -55, 49, -31, -10, 0, 8, 99, 97, -23, 74, 100, -46, -5, 13, 97, 63, 76)
h_bonds <- c(0, 7, 5, 4, 0, 4, 5, 0, 3, 0, 0, 3, 0, 0, 0, 3, 3, 1, 3, 0)
mol_weight <-c(71, 156, 114, 115, 103, 129, 128, 57, 137, 113, 113, 128, 131, 147, 97, 87, 101, 186, 163, 99)
amino_acids.data <- data.frame(name, quality, abundance, isoelectric, hp_k_d, hp_janin, hp_ph7, h_bonds, mol_weight)
#Identifying items in tail to investigate
pten1_nonsense <- subset(pten1_proc, class == "nonsense")
tpmt1_nonsense <- subset(tpmt1_proc, class == "nonsense")
pten1_synon <- subset(pten1_proc, class == "synonymous")
tpmt1_synon <- subset(tpmt1_proc, class == "synonymous")
pten1_no_missense <- subset(pten1_proc, class == "synonymous" | class == "nonsense")
ggplot(pten1_nonsense, aes(x=score)) + geom_histogram(binwidth=.01, colour="blue", fill="white")

#+ geom_density()
ggplot(pten1_synon, aes(x=score)) + geom_histogram(binwidth=.01, colour="red", fill="white")

ggplot(pten1_proc_wt, aes(x=score)) + geom_histogram(data=subset(pten1_proc_wt,class == "nonsense"), fill = "red", alpha = 0.5, binwidth=.01) + geom_histogram(data=subset(pten1_proc_wt,class == "synonymous"), fill = "blue", alpha = 0.5, binwidth=.01) + geom_histogram(data=subset(pten1_proc_wt,class == "missense"), fill = "green", alpha = 0.2, binwidth=.01)

ggplot(pten1_no_missense, aes(x=score)) + geom_histogram(data=subset(pten1_no_missense,class == "nonsense"), fill = "red", alpha = 0.5, binwidth=.01) + geom_histogram(data=subset(pten1_no_missense,class == "synonymous"), fill = "blue", alpha = 0.5, binwidth=.01)

ggplot(tpmt1_synon, aes(x=score)) + geom_histogram(binwidth=.01, colour="red", fill="white")

ggplot(tpmt1_nonsense, aes(x=score)) + geom_histogram(binwidth=.01, colour="blue", fill="white")

nonsense_tail <- subset(pten1_nonsense, score > 0.55)
synon_tail <- subset(pten1_synon, score < 0.6)
nonsense_tail$secondary_struct <- ifelse(is.na(nonsense_tail$helix), "unknown",
ifelse(nonsense_tail$helix==1, "helix",
ifelse(nonsense_tail$sheet==1, "sheet",
ifelse(nonsense_tail$helix==0, "neither",
"unknown"))))
synon_tail$secondary_struct <- ifelse(is.na(synon_tail$helix), "unknown",
ifelse(synon_tail$helix==1, "helix",
ifelse(synon_tail$sheet==1, "sheet",
ifelse(synon_tail$helix==0, "neither",
"unknown"))))
#data[row,column]
n_tail <- nonsense_tail[,c(1,2,7,30,127)]
s_tail <- synon_tail[,c(1,2,7,30,127)]
n_tail$bp_pos <- (n_tail$position-1)*3
s_tail$bp_pos <- (s_tail$position-1)*3
n_tail
s_tail
#just in case there is a discernible pattern
s_tail_pos <- ggplot(s_tail, aes(x=position, y=score, colour=secondary_struct))+ geom_point(size=.3) + scale_x_continuous(minor_breaks = seq(0, 405, 5)) + scale_color_manual(values=c("#FF4848", "#00C853", "#5757FF", "#A9A9A9")) +ylab("VAMP-seq score")+xlab("Position in PTEN")+labs(colour="Secondary Structure")+ggtitle("PTEN synonymous variant tail scores in relation to protein structure") + geom_vline(xintercept=47, color="black", size=.1) + geom_vline(xintercept=78, color="black", size=.1) + geom_vline(xintercept=122.5, color="black", size=.1) + geom_vline(xintercept=140, color="black", size=.1) + geom_vline(xintercept=165, color="black", size=.1) + geom_vline(xintercept=194, color="black", size=.1) + geom_vline(xintercept=209, color="black", size=.1)
plot(s_tail_pos)

#help visualizing NMD rules
n_tail_pos <- ggplot(n_tail, aes(x=position, y=score, colour=secondary_struct))+ geom_point(size=.3) + scale_x_continuous(minor_breaks = seq(0, 405, 5)) + scale_color_manual(values=c("#FF4848", "#00C853", "#5757FF", "#A9A9A9")) +ylab("VAMP-seq score")+xlab("Position in PTEN")+labs(colour="Secondary Structure")+ggtitle("PTEN nonsense variant tail scores in relation to protein structure") + geom_vline(xintercept=47, color="black", size=.1) + geom_vline(xintercept=78, color="black", size=.1) + geom_vline(xintercept=122.5, color="black", size=.1) + geom_vline(xintercept=140, color="black", size=.1) + geom_vline(xintercept=165, color="black", size=.1) + geom_vline(xintercept=194, color="black", size=.1) + geom_vline(xintercept=209, color="black", size=.1)
plot(n_tail_pos)

s_tail$prob_AG_GT <- c(0, 1/6, 1/2, 0, 1/2, 1/6)
s_tail$prob_titv <- c(0, 2/3, 2/3, 0, 2/3, 1/3)
ggplot(n_tail, aes(x=position,y=score)) + geom_point() + geom_smooth(method = "lm")

ggplot(s_tail, aes(x=prob_titv,y=score)) + geom_point() + geom_smooth(method = "lm")

ggplot(s_tail, aes(y=prob_titv,x=score)) + geom_point() + geom_smooth(method = "lm")

rsq <- function (x, y) cor(x, y)^2
n_rsq <- rsq(n_tail$position, s_tail$score)
s_rsq <- rsq(s_tail$prob_titv, s_tail$score)
n_rsq
[1] 0.462512
s_rsq
[1] 0.02100406
#no relationship...
# pten1_proc_wt$secondary_struct <- ifelse(is.na(pten1_proc_wt$helix), "unknown",
# ifelse(pten1_proc_wt$helix==1, "helix",
# ifelse(pten1_proc_wt$sheet==1, "sheet",
# ifelse(pten1_proc_wt$helix==0, "neither",
# "unknown"))))
#start position within pten gene
# n_tail$s_pos <- ifelse((n_tail$bp_pos_cum)>e1, (
# ifelse((n_tail$bp_pos_cum) > (e1+e2), (
# ifelse((n_tail$bp_pos_cum) > (e1+e2+e3), (
# ifelse((n_tail$bp_pos_cum) > (e1+e2+e3), (
#
# ), (n_tail$bp_pos_cum+e4_s))
# ), (n_tail$bp_pos_cum+e3_s))
# ), (n_tail$bp_pos_cum+e2_s))
# ), (n_tail$bp_pos_cum+e1_s))
#end position within pten gene
#within 2 amino acids of junction
# #e1_s is the first bp of the first exon
# e1_s = 89624227
# #e1_e is the last bp of the first exon,
# e1_e = 89624305
# #e1 is length in bp
# el = 79
# e2 = 85
# e3 = 45
# e4 = 44
# e5 = 239
# e6 = 142
# e7 = 167
# e8 = 225
# e9 = 186
# e2_s = 89653782
# e2_e = 89653866
# e3_s = 89685270
# e3_e = 89685314
# e4_s = 89690803
# e4_e = 89690846
# e5_s = 89692770
# e5_e = 89693008
# e6_s = 89711875
# e6_e = 89712016
# e7_s = 89717610
# e7_e = 89717776
# e8_s = 89720651
# e8_e = 89720875
# e9_s = 89725044
# e9_e = 89725229
library(googlesheets)
gs_ls()
Auto-refreshing stale OAuth token.
tpmt_ruddle <- gs_title("TPMT_ruddle")
Sheet successfully identified: "TPMT_ruddle"
tpmt_read <- gs_read(ss=tpmt_ruddle, ws = "ruddle_tpmt_variants")
Accessing worksheet titled 'ruddle_tpmt_variants'.
Downloading: 1.1 kB
Downloading: 1.1 kB
Downloading: 2.5 kB
Downloading: 2.5 kB
Downloading: 3.8 kB
Downloading: 3.8 kB
Downloading: 4.1 kB
Downloading: 4.1 kB
Downloading: 5.3 kB
Downloading: 5.3 kB
Downloading: 6.5 kB
Downloading: 6.5 kB
Downloading: 7.6 kB
Downloading: 7.6 kB
Downloading: 9 kB
Downloading: 9 kB
Downloading: 9.7 kB
Downloading: 9.7 kB
Downloading: 11 kB
Downloading: 11 kB
Downloading: 12 kB
Downloading: 12 kB
Downloading: 13 kB
Downloading: 13 kB
Downloading: 13 kB
Downloading: 13 kB
Downloading: 14 kB
Downloading: 14 kB
Downloading: 14 kB
Downloading: 14 kB
Downloading: 16 kB
Downloading: 16 kB
Downloading: 16 kB
Downloading: 16 kB
Downloading: 18 kB
Downloading: 18 kB
Downloading: 18 kB
Downloading: 18 kB
Downloading: 19 kB
Downloading: 19 kB
Downloading: 19 kB
Downloading: 19 kB
Downloading: 20 kB
Downloading: 20 kB
Downloading: 20 kB
Downloading: 20 kB
Downloading: 21 kB
Downloading: 21 kB
Downloading: 22 kB
Downloading: 22 kB
Downloading: 23 kB
Downloading: 23 kB
Downloading: 24 kB
Downloading: 24 kB
Downloading: 25 kB
Downloading: 25 kB
Downloading: 26 kB
Downloading: 26 kB
Downloading: 27 kB
Downloading: 27 kB
Downloading: 28 kB
Downloading: 28 kB
Downloading: 28 kB
Downloading: 28 kB
Downloading: 29 kB
Downloading: 29 kB
Downloading: 30 kB
Downloading: 30 kB
Downloading: 32 kB
Downloading: 32 kB
Downloading: 33 kB
Downloading: 33 kB
Downloading: 34 kB
Downloading: 34 kB
Downloading: 35 kB
Downloading: 35 kB
Downloading: 36 kB
Downloading: 36 kB
Downloading: 37 kB
Downloading: 37 kB
Downloading: 39 kB
Downloading: 39 kB
Downloading: 39 kB
Downloading: 39 kB
Downloading: 40 kB
Downloading: 40 kB
Downloading: 42 kB
Downloading: 42 kB
Downloading: 43 kB
Downloading: 43 kB
Downloading: 44 kB
Downloading: 44 kB
Downloading: 44 kB
Downloading: 44 kB
Downloading: 45 kB
Downloading: 45 kB
Downloading: 46 kB
Downloading: 46 kB
Downloading: 46 kB
Downloading: 46 kB
Downloading: 48 kB
Downloading: 48 kB
Downloading: 49 kB
Downloading: 49 kB
Downloading: 49 kB
Downloading: 49 kB
Downloading: 50 kB
Downloading: 50 kB
Downloading: 50 kB
Downloading: 50 kB
Downloading: 51 kB
Downloading: 51 kB
Downloading: 52 kB
Downloading: 52 kB
Downloading: 53 kB
Downloading: 53 kB
Downloading: 55 kB
Downloading: 55 kB
Downloading: 56 kB
Downloading: 56 kB
Downloading: 57 kB
Downloading: 57 kB
Downloading: 58 kB
Downloading: 58 kB
Downloading: 59 kB
Downloading: 59 kB
Downloading: 60 kB
Downloading: 60 kB
Downloading: 60 kB
Downloading: 60 kB
Downloading: 61 kB
Downloading: 61 kB
Downloading: 62 kB
Downloading: 62 kB
Downloading: 64 kB
Downloading: 64 kB
Downloading: 65 kB
Downloading: 65 kB
Downloading: 65 kB
Downloading: 65 kB
Downloading: 66 kB
Downloading: 66 kB
Downloading: 68 kB
Downloading: 68 kB
Downloading: 69 kB
Downloading: 69 kB
Downloading: 70 kB
Downloading: 70 kB
Downloading: 71 kB
Downloading: 71 kB
Downloading: 71 kB
Downloading: 71 kB
Downloading: 72 kB
Downloading: 72 kB
Downloading: 73 kB
Downloading: 73 kB
Downloading: 74 kB
Downloading: 74 kB
Downloading: 75 kB
Downloading: 75 kB
Downloading: 75 kB
Downloading: 75 kB
Downloading: 77 kB
Downloading: 77 kB
Downloading: 77 kB
Downloading: 77 kB
Downloading: 78 kB
Downloading: 78 kB
Downloading: 80 kB
Downloading: 80 kB
Downloading: 81 kB
Downloading: 81 kB
Downloading: 82 kB
Downloading: 82 kB
Downloading: 83 kB
Downloading: 83 kB
Downloading: 84 kB
Downloading: 84 kB
Downloading: 85 kB
Downloading: 85 kB
Downloading: 87 kB
Downloading: 87 kB
Downloading: 88 kB
Downloading: 88 kB
Downloading: 88 kB
Downloading: 88 kB
Downloading: 89 kB
Downloading: 89 kB
Downloading: 90 kB
Downloading: 90 kB
Downloading: 91 kB
Downloading: 91 kB
Downloading: 92 kB
Downloading: 92 kB
Downloading: 93 kB
Downloading: 93 kB
Downloading: 94 kB
Downloading: 94 kB
Downloading: 95 kB
Downloading: 95 kB
Downloading: 95 kB
Downloading: 95 kB
Downloading: 96 kB
Downloading: 96 kB
Downloading: 97 kB
Downloading: 97 kB
Downloading: 98 kB
Downloading: 98 kB
Downloading: 100 kB
Downloading: 100 kB
Downloading: 100 kB
Downloading: 100 kB
Downloading: 100 kB
Downloading: 100 kB
Downloading: 100 kB
Downloading: 100 kB
Downloading: 100 kB
Downloading: 100 kB
Downloading: 100 kB
Downloading: 100 kB
Downloading: 100 kB
Downloading: 100 kB
Downloading: 100 kB
Downloading: 100 kB
Downloading: 110 kB
Downloading: 110 kB
Downloading: 110 kB
Downloading: 110 kB
Downloading: 110 kB
Downloading: 110 kB
Downloading: 110 kB
Downloading: 110 kB
Downloading: 110 kB
Downloading: 110 kB
Downloading: 110 kB
Downloading: 110 kB
Downloading: 110 kB
Downloading: 110 kB
Downloading: 110 kB
Downloading: 110 kB
Downloading: 110 kB
Downloading: 110 kB
Downloading: 110 kB
Downloading: 110 kB
Downloading: 120 kB
Downloading: 120 kB
Downloading: 120 kB
Downloading: 120 kB
Downloading: 120 kB
Downloading: 120 kB
Downloading: 120 kB
Downloading: 120 kB
Downloading: 120 kB
Downloading: 120 kB
Downloading: 120 kB
Downloading: 120 kB
Downloading: 120 kB
Downloading: 120 kB
Downloading: 120 kB
Downloading: 120 kB
Downloading: 120 kB
Downloading: 120 kB
Downloading: 120 kB
Downloading: 120 kB
Downloading: 120 kB
Downloading: 120 kB
Downloading: 120 kB
Downloading: 120 kB
Downloading: 120 kB
Downloading: 120 kB
Downloading: 130 kB
Downloading: 130 kB
Downloading: 130 kB
Downloading: 130 kB
Downloading: 130 kB
Downloading: 130 kB
Downloading: 130 kB
Downloading: 130 kB
Downloading: 130 kB
Downloading: 130 kB
Downloading: 130 kB
Downloading: 130 kB
Downloading: 130 kB
Downloading: 130 kB
Downloading: 130 kB
Downloading: 130 kB
Downloading: 130 kB
Downloading: 130 kB
Downloading: 130 kB
Downloading: 130 kB
Downloading: 130 kB
Downloading: 130 kB
Downloading: 130 kB
Downloading: 130 kB
Downloading: 140 kB
Downloading: 140 kB
Downloading: 140 kB
Downloading: 140 kB
Downloading: 140 kB
Downloading: 140 kB
Downloading: 140 kB
Downloading: 140 kB
Downloading: 140 kB
Downloading: 140 kB
Downloading: 140 kB
Downloading: 140 kB
Downloading: 140 kB
Downloading: 140 kB
Downloading: 140 kB
Downloading: 140 kB
Downloading: 140 kB
Downloading: 140 kB
Downloading: 150 kB
Downloading: 150 kB
Downloading: 150 kB
Downloading: 150 kB
Downloading: 150 kB
Downloading: 150 kB
Downloading: 150 kB
Downloading: 150 kB
Downloading: 150 kB
Downloading: 150 kB
Downloading: 150 kB
Downloading: 150 kB
Downloading: 150 kB
Downloading: 150 kB
Downloading: 150 kB
Downloading: 150 kB
Downloading: 150 kB
Downloading: 150 kB
Downloading: 150 kB
Downloading: 150 kB
Downloading: 160 kB
Downloading: 160 kB
Downloading: 160 kB
Downloading: 160 kB
Downloading: 160 kB
Downloading: 160 kB
Downloading: 160 kB
Downloading: 160 kB
Downloading: 160 kB
Downloading: 160 kB
Downloading: 160 kB
Downloading: 160 kB
Downloading: 160 kB
Downloading: 160 kB
Downloading: 160 kB
Downloading: 160 kB
Downloading: 160 kB
Downloading: 160 kB
Downloading: 160 kB
Downloading: 160 kB
Downloading: 160 kB
Downloading: 160 kB
Downloading: 160 kB
Downloading: 160 kB
Downloading: 160 kB
Downloading: 160 kB
Downloading: 170 kB
Downloading: 170 kB
Downloading: 170 kB
Downloading: 170 kB
Downloading: 170 kB
Downloading: 170 kB
Downloading: 170 kB
Downloading: 170 kB
Downloading: 170 kB
Downloading: 170 kB
Downloading: 170 kB
Downloading: 170 kB
Downloading: 170 kB
Downloading: 170 kB
Downloading: 170 kB
Downloading: 170 kB
Downloading: 170 kB
Downloading: 170 kB
Downloading: 170 kB
Downloading: 170 kB
Downloading: 170 kB
Downloading: 170 kB
Downloading: 170 kB
Downloading: 170 kB
Downloading: 170 kB
Downloading: 170 kB
Downloading: 170 kB
Downloading: 170 kB
Downloading: 180 kB
Downloading: 180 kB
Downloading: 180 kB
Downloading: 180 kB
Downloading: 180 kB
Downloading: 180 kB
Downloading: 180 kB
Downloading: 180 kB
Downloading: 180 kB
Downloading: 180 kB
Downloading: 180 kB
Downloading: 180 kB
Downloading: 180 kB
Downloading: 180 kB
Downloading: 180 kB
Downloading: 180 kB
Downloading: 180 kB
Downloading: 180 kB
Downloading: 180 kB
Downloading: 180 kB
Downloading: 180 kB
Downloading: 180 kB
Downloading: 180 kB
Downloading: 180 kB
Downloading: 190 kB
Downloading: 190 kB
Downloading: 190 kB
Downloading: 190 kB
Downloading: 190 kB
Downloading: 190 kB
Downloading: 190 kB
Downloading: 190 kB
Downloading: 190 kB
Downloading: 190 kB
Downloading: 190 kB
Downloading: 190 kB
Downloading: 190 kB
Downloading: 190 kB
Downloading: 190 kB
Downloading: 190 kB
Downloading: 190 kB
Downloading: 190 kB
Downloading: 190 kB
Downloading: 190 kB
Downloading: 190 kB
Downloading: 190 kB
Downloading: 190 kB
Downloading: 190 kB
Downloading: 190 kB
Downloading: 190 kB
Downloading: 190 kB
Downloading: 190 kB
Downloading: 200 kB
Downloading: 200 kB
Downloading: 200 kB
Downloading: 200 kB
Downloading: 200 kB
Downloading: 200 kB
Downloading: 200 kB
Downloading: 200 kB
Downloading: 200 kB
Downloading: 200 kB
Downloading: 200 kB
Downloading: 200 kB
Downloading: 200 kB
Downloading: 200 kB
Downloading: 200 kB
Downloading: 200 kB
Downloading: 200 kB
Downloading: 200 kB
Downloading: 200 kB
Downloading: 200 kB
Downloading: 200 kB
Downloading: 200 kB
Downloading: 200 kB
Downloading: 200 kB
Downloading: 200 kB
Downloading: 200 kB
Downloading: 210 kB
Downloading: 210 kB
Downloading: 210 kB
Downloading: 210 kB
Downloading: 210 kB
Downloading: 210 kB
Downloading: 210 kB
Downloading: 210 kB
Downloading: 210 kB
Downloading: 210 kB
Downloading: 210 kB
Downloading: 210 kB
Downloading: 210 kB
Downloading: 210 kB
Downloading: 210 kB
Downloading: 210 kB
Downloading: 210 kB
Downloading: 210 kB
Downloading: 210 kB
Downloading: 210 kB
Downloading: 220 kB
Downloading: 220 kB
Downloading: 220 kB
Downloading: 220 kB
Downloading: 220 kB
Downloading: 220 kB
Downloading: 220 kB
Downloading: 220 kB
Downloading: 220 kB
Downloading: 220 kB
Downloading: 220 kB
Downloading: 220 kB
Downloading: 220 kB
Downloading: 220 kB
Downloading: 220 kB
Downloading: 220 kB
Downloading: 220 kB
Downloading: 220 kB
Downloading: 220 kB
Downloading: 220 kB
Downloading: 230 kB
Downloading: 230 kB
Downloading: 230 kB
Downloading: 230 kB
Downloading: 230 kB
Downloading: 230 kB
Downloading: 230 kB
Downloading: 230 kB
Downloading: 230 kB
Downloading: 230 kB
Downloading: 230 kB
Downloading: 230 kB
Downloading: 230 kB
Downloading: 230 kB
Downloading: 230 kB
Downloading: 230 kB
Downloading: 230 kB
Downloading: 230 kB
Downloading: 230 kB
Downloading: 230 kB
Downloading: 230 kB
Downloading: 230 kB
Downloading: 230 kB
Downloading: 230 kB
Downloading: 230 kB
Downloading: 230 kB
Downloading: 240 kB
Downloading: 240 kB
Downloading: 240 kB
Downloading: 240 kB
Downloading: 240 kB
Downloading: 240 kB
Downloading: 240 kB
Downloading: 240 kB
Downloading: 240 kB
Downloading: 240 kB
Downloading: 240 kB
Downloading: 240 kB
Downloading: 240 kB
Downloading: 240 kB
Downloading: 240 kB
Downloading: 240 kB
Downloading: 240 kB
Downloading: 240 kB
Downloading: 240 kB
Downloading: 240 kB
Downloading: 250 kB
Downloading: 250 kB
Downloading: 250 kB
Downloading: 250 kB
Downloading: 250 kB
Downloading: 250 kB
Downloading: 250 kB
Downloading: 250 kB
Downloading: 250 kB
Downloading: 250 kB
Downloading: 250 kB
Downloading: 250 kB
Downloading: 250 kB
Downloading: 250 kB
Downloading: 250 kB
Downloading: 250 kB
Downloading: 250 kB
Downloading: 250 kB
Downloading: 250 kB
Downloading: 250 kB
Downloading: 250 kB
Downloading: 250 kB
Downloading: 260 kB
Downloading: 260 kB
Downloading: 260 kB
Downloading: 260 kB
Downloading: 260 kB
Downloading: 260 kB
Downloading: 260 kB
Downloading: 260 kB
Downloading: 260 kB
Downloading: 260 kB
Downloading: 260 kB
Downloading: 260 kB
Downloading: 260 kB
Downloading: 260 kB
Downloading: 270 kB
Downloading: 270 kB
Downloading: 270 kB
Downloading: 270 kB
Downloading: 270 kB
Downloading: 270 kB
Downloading: 270 kB
Downloading: 270 kB
Downloading: 270 kB
Downloading: 270 kB
Downloading: 270 kB
Downloading: 270 kB
Downloading: 270 kB
Downloading: 270 kB
Downloading: 270 kB
Downloading: 270 kB
Downloading: 270 kB
Downloading: 270 kB
Downloading: 280 kB
Downloading: 280 kB
Downloading: 280 kB
Downloading: 280 kB
Downloading: 280 kB
Downloading: 280 kB
Downloading: 280 kB
Downloading: 280 kB
Downloading: 280 kB
Downloading: 280 kB
Downloading: 280 kB
Downloading: 280 kB
Downloading: 280 kB
Downloading: 280 kB
Downloading: 280 kB
Downloading: 280 kB
Downloading: 280 kB
Downloading: 280 kB
Downloading: 280 kB
Downloading: 280 kB
Downloading: 280 kB
Downloading: 280 kB
Downloading: 290 kB
Downloading: 290 kB
Downloading: 290 kB
Downloading: 290 kB
Downloading: 290 kB
Downloading: 290 kB
Downloading: 290 kB
Downloading: 290 kB
Downloading: 290 kB
Downloading: 290 kB
Downloading: 290 kB
Downloading: 290 kB
Downloading: 290 kB
Downloading: 290 kB
Downloading: 290 kB
Downloading: 290 kB
Downloading: 290 kB
Downloading: 290 kB
Downloading: 290 kB
Downloading: 290 kB
Downloading: 300 kB
Downloading: 300 kB
Downloading: 300 kB
Downloading: 300 kB
Downloading: 300 kB
Downloading: 300 kB
Downloading: 300 kB
Downloading: 300 kB
Downloading: 300 kB
Downloading: 300 kB
Downloading: 300 kB
Downloading: 300 kB
Downloading: 300 kB
Downloading: 300 kB
Downloading: 300 kB
Downloading: 300 kB
Downloading: 300 kB
Downloading: 300 kB
Downloading: 300 kB
Downloading: 300 kB
Downloading: 300 kB
Downloading: 300 kB
Downloading: 310 kB
Downloading: 310 kB
Downloading: 310 kB
Downloading: 310 kB
Downloading: 310 kB
Downloading: 310 kB
Downloading: 310 kB
Downloading: 310 kB
Downloading: 310 kB
Downloading: 310 kB
Downloading: 310 kB
Downloading: 310 kB
Downloading: 310 kB
Downloading: 310 kB
Downloading: 310 kB
Downloading: 310 kB
Downloading: 310 kB
Downloading: 310 kB
Parsed with column specification:
cols(
.default = col_character(),
chr = col_integer(),
pos = col_integer(),
hg18_pos = col_integer(),
hg38_pos = col_integer(),
aapos = col_integer(),
MutationTaster_score = col_double(),
MutationTaster_converted_rankscore = col_double(),
`Eigen-raw` = col_double(),
`Eigen-phred` = col_double(),
`Eigen-PC-raw` = col_double(),
`Eigen-PC-phred` = col_double(),
`Eigen-PC-raw_rankscore` = col_double(),
CADD_raw = col_double(),
CADD_raw_rankscore = col_double(),
CADD_phred = col_double(),
`GERP++_NR` = col_double(),
`GERP++_RS` = col_double(),
`GERP++_RS_rankscore` = col_double(),
phyloP46way_primate = col_double(),
phyloP46way_primate_rankscore = col_double()
# ... with 12 more columns
)
See spec(...) for full column specifications.
tpmt_ruddle_data <- as.data.frame(tpmt_read)
#reversing data to fit tpmt1_data
rever <- function(df=tpmt_ruddle_data){df<-df[dim(df)[1]:1,]}
tpmt_ruddle_data_rev = rever(tpmt_ruddle_data)
#creating variant column, equiv to tpmt1_data's
tpmt_ruddle_data_rev$variant <- do.call(paste, c(tpmt_ruddle_data_rev[c(5,24,6)], sep=""))
#making both tables smaller
tpmt_essential <- tpmt_ruddle_data_rev[,c(2,3,4,5,6,17,19,24,27,28,29,30,31,32,33,34,35,76,77,78,137)]
tpmt1_proc_ess <- tpmt1_proc_wt[,c(1,2,3,5,6,7,30,32,80)]
#merging tables with variant name
tpmt_merge <- merge(tpmt1_proc_ess, tpmt_essential, by="variant")
tpmt_cor1 <- ggplot(tpmt_merge, aes(x=score, y=as.numeric(SIFT_score)))+ geom_point(alpha = 0.2) + xlab("VAMP-seq score")+ylab("SIFT score")+ggtitle("1")
tpmt_cor1.5 <- ggplot(tpmt_merge, aes(x=score, y=as.numeric(SIFT_converted_rankscore)))+ geom_point(alpha = 0.2) + xlab("VAMP-seq score")+ylab("SIFT converted rankscore")+ggtitle("1.5")
tpmt_cor5 <- ggplot(tpmt_merge, aes(x=score, y=CADD_raw_rankscore))+ geom_point(alpha = 0.2) + xlab("VAMP-seq score")+ylab("CADD raw rankscore")+ggtitle("5")
tpmt_cor2 <- ggplot(tpmt_merge, aes(x=score, y=as.numeric(Polyphen2_HDIV_score)))+ geom_point(alpha = 0.2) + xlab("VAMP-seq score")+ylab("Polyphen2 HDIV score")+ggtitle("2")
tpmt_cor3 <- ggplot(tpmt_merge, aes(x=score, y=as.numeric(Polyphen2_HVAR_score)))+ geom_point(alpha = 0.2) + xlab("VAMP-seq score")+ylab("Polyphen2 HVAR score")+ggtitle("3")
tpmt_cor2.5 <- ggplot(tpmt_merge, aes(x=score, y=as.numeric(Polyphen2_HDIV_rankscore)))+ geom_point(alpha = 0.2) + xlab("VAMP-seq score")+ylab("Polyphen2 HDIV rankscore")+ggtitle("2.5")
tpmt_cor3.5 <- ggplot(tpmt_merge, aes(x=score, y=as.numeric(Polyphen2_HVAR_rankscore)))+ geom_point(alpha = 0.2) + xlab("VAMP-seq score")+ylab("Polyphen2 HVAR rankscore")+ggtitle("3.5")
#CADD_phred not worth
#plot(tpmt_cor5)
#plot(tpmt_cor1)
#plot(tpmt_cor1.5)
plot(tpmt_cor2)

plot(tpmt_cor3)

plot(tpmt_cor2.5)

plot(tpmt_cor3.5)

TPMT_abun_CADD <- ggplot(tpmt_merge, aes(x=abundance_class, y=CADD_raw_rankscore)) + geom_violin(draw_quantiles = c( 0.5))+ylab("CADD raw rankscore")+xlab("Abundance Class")
plot(TPMT_abun_CADD)

TPMT_abun_SIFT_conv <- ggplot(tpmt_merge, aes(x=abundance_class, y=as.numeric(SIFT_converted_rankscore))) + geom_violin(draw_quantiles = c(0.5))+ylab("SIFT conv rankscore")+xlab("Abundance Class")
plot(TPMT_abun_SIFT_conv)

TPMT_abun_POLY <- ggplot(tpmt_merge, aes(x=abundance_class, y=as.numeric(Polyphen2_HDIV_rankscore))) + geom_violin(draw_quantiles = c( 0.5))+ylab("Polyphen2 HDIV rankscore")+xlab("Abundance Class")
plot(TPMT_abun_POLY)

TPMT_abun_POLY1 <- ggplot(tpmt_merge, aes(x=abundance_class, y=as.numeric(Polyphen2_HVAR_rankscore))) + geom_violin(draw_quantiles = c( 0.5))+ylab("Polyphen2 HVAR rankscore")+xlab("Abundance Class")
plot(TPMT_abun_POLY1)

library(tidyr)
Attaching package: ‘tidyr’
The following object is masked from ‘package:reshape2’:
smiths
library(dplyr)
package ‘dplyr’ was built under R version 3.5.1
Attaching package: ‘dplyr’
The following object is masked from ‘package:gridExtra’:
combine
The following objects are masked from ‘package:stats’:
filter, lag
The following objects are masked from ‘package:base’:
intersect, setdiff, setequal, union
Pred_abun_SIFT <- ggplot(tpmt_merge, aes(abundance_class)) + geom_bar(aes(fill = SIFT_pred)) + ggtitle("Abundance class vs SIFT prediction of Damaging or Tolerated")
plot(Pred_abun_SIFT)

trial_sep <- tpmt_merge[c(21,23,24,26)]
tpmt_merge_expand <- separate_rows(tpmt_merge, c("Polyphen2_HDIV_score", "Polyphen2_HDIV_pred", "Polyphen2_HVAR_score", "Polyphen2_HVAR_pred"))
Pred_abun_HVAR <- ggplot(tpmt_merge_expand, aes(abundance_class)) + geom_bar(aes(fill = Polyphen2_HVAR_pred)) + ggtitle("Abundance class vs Polyphen2 HVAR predictions") + labs(subtitle = "D: Probably Damaging, P: Possibly Damaging, B: Benign")
plot(Pred_abun_HVAR)

LS0tCnRpdGxlOiAiUFRFTiBSIE5vdGVib29rIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCmBgYHtyIGdsb2JhbF9vcHRpb25zLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KGtuaXRyKQprbml0cjo6b3B0c19jaHVuayRzZXQoZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTEyLCB3YXJuaW5nPUZBTFNFKQpgYGAKCmBgYHtyfQpwYXIocGNoPTIwLCBjZXg9LjYpCnB0ZW4xX2RhdGEgPC0gcmVhZC5kZWxpbSgnfi9sZWtsYWIvbGVrbGFiL3B0ZW4xLnR4dCcpCnB0ZW4xX3Byb2MgPC0gcHRlbjFfZGF0YVshaXMubmEocHRlbjFfZGF0YSRhYnVuZGFuY2VfY2xhc3MpLF0KZGQgPC0gZGF0YS5mcmFtZShwdGVuMV9wcm9jJGFidW5kYW5jZV9jbGFzcyxwdGVuMV9wcm9jJHNjb3JlKQpjb2xuYW1lcyhkZCkgPC0gYygiYWJ1bmRhbmNlX2NsYXNzIiwgInNjb3JlIikKdHBtdDFfZGF0YSA8LSByZWFkLmRlbGltKCd+L2xla2xhYi9sZWtsYWIvdHBtdF9zdXBwbF8yLnR4dCcpCnRwbXQxX3Byb2MgPC0gdHBtdDFfZGF0YVshaXMubmEodHBtdDFfZGF0YSRhYnVuZGFuY2VfY2xhc3MpLF0KZWUgPC0gZGF0YS5mcmFtZSh0cG10MV9wcm9jJGFidW5kYW5jZV9jbGFzcyx0cG10MV9wcm9jJHNjb3JlKQpjb2xuYW1lcyhlZSkgPC0gYygiYWJ1bmRhbmNlX2NsYXNzIiwgInNjb3JlIikKZGQkcHJvdGVpbiA8LSByZXAoIlBURU4iLCBucm93KGRkKSkKZWUkcHJvdGVpbiA8LSByZXAoIlRQTVQiLCBucm93KGVlKSkKZmYgPSBkYXRhLmZyYW1lKHJiaW5kKGRkLCBlZSkpCmJicHAgPSBib3hwbG90KHNjb3JlfnByb3RlaW4rYWJ1bmRhbmNlX2NsYXNzLCBkYXRhID0gZmYsIGF0ID0gYygxLCAxLjgsIDMsIDMuOCwgNSwgNS44LCA3LjIsIDgpLCB4YXh0PSduJywgY29sID0gYygnd2hpdGUnLCAnZ3JheScpKQpheGlzKHNpZGU9MSwgYXQ9YygxLjQsIDMuNCwgNS40LCA3LjYpLCBsYWJlbHM9YygnbG93JywgJ3Bvc3NpYmx5IGxvdycsICdwb3NzaWJseVxuIHd0LWxpa2UnLCAnd3QtbGlrZScpKQp0aXRsZSgnVkFNUC1zZXEgc2NvcmVzIG9mIFBURU4gYW5kIFRQTVQgVmFyaWFudHNcbmFuZCBhYnVuZGFuY2UgY2xhc3MnKQoKCiNwbG90KHggPSBwdGVuMV9wcm9jJGFidW5kYW5jZV9jbGFzcywgeSA9IHB0ZW4xX3Byb2Mkc2NvcmUsdHlwZT0ncCcsIG1haW4gPSAiUFRFTiIsIHhsYWIgPSAiQWJ1bmRhbmNlIiwgeWxhYiA9ICJWQU1QLXNlcSBzY29yZSIsIGNvbD0iIzc0QUJENiIpCiNwb2ludHMoeCA9IHRwbXQxX3Byb2MkYWJ1bmRhbmNlX2NsYXNzLCB5ID0gdHBtdDFfcHJvYyRzY29yZSwgdHlwZT0ncCcsIGNvbCA9ICIjQURERkFEIikKYGBgCmBgYHtyfQpsaWJyYXJ5KHJlc2hhcGUyKQojIGQgPC0gcmVhZC50YWJsZSh0ZXh0ID0gImNvbF9hIGNvbF9iIAojICAgICAgICAgICAgICAgICAgICAgICAgIGFhICAgIDEKIyAgICAgICAgICAgICAgICAgICAgICAgICBiYSAgICAxLjI1CiMgICAgICAgICAgICAgICAgICAgICAgICAgYmEgICAgMQojICAgICAgICAgICAgICAgICAgICAgICAgIGJhICAgIDEuMjUKIyAgICAgICAgICAgICAgICAgICAgICAgICBjYSAgICAxLjMKIyAgICAgICAgICAgICAgICAgICAgICAgICBjYSAgICAxLjI1CiMgICAgICAgICAgICAgICAgICAgICAgICAgZGEgICAgMS41CiMgICAgICAgICAgICAgICAgICAgICAgICAgZGEgICAgMS4yNQojICAgICAgICAgICAgICAgICAgICAgICAgIGFhICAgIDEuNwojICAgICAgICAgICAgICAgICAgICAgICAgIGNhICAgIDEuMjUKIyAgICAgICAgICAgICAgICAgICAgICAgICBiYSAgICAxLjIKIyAgICAgICAgICAgICAgICAgICAgICAgICBkYSAgICAxLjI1CiMgICAgICAgICAgICAgICAgICAgICAgICAgYWEgICAgMS40CiMgICAgICAgICAgICAgICAgICAgICAgICAgYWEgICAgMS4yNQojICAgICAgICAgICAgICAgICAgICAgICAgIGNhICAgIDEuMQojICAgICAgICAgICAgICAgICAgICAgICAgIGFhICAgIDEuMjUiLCAKIyAgICAgICAgICAgICAgICAgaGVhZGVyID0gVFJVRSwpCiMgZSA8LSByZWFkLnRhYmxlKHRleHQgPSAiY29sX2EgY29sX2IgCiMgICAgICAgICAgICAgICAgICAgICAgICAgYWEgICAgMS42CiMgICAgICAgICAgICAgICAgICAgICAgICAgYWEgICAgMS41NQojICAgICAgICAgICAgICAgICAgICAgICAgIGJhICAgIDEuMgojICAgICAgICAgICAgICAgICAgICAgICAgIGJhICAgIDEuNDUKIyAgICAgICAgICAgICAgICAgICAgICAgICBjYSAgICAxLjgKIyAgICAgICAgICAgICAgICAgICAgICAgICBjYSAgICAxLjU1CiMgICAgICAgICAgICAgICAgICAgICAgICAgZGEgICAgMS41CiMgICAgICAgICAgICAgICAgICAgICAgICAgZGEgICAgMS4zNQojICAgICAgICAgICAgICAgICAgICAgICAgIGFhICAgIDEuOQojICAgICAgICAgICAgICAgICAgICAgICAgIGNhICAgIDEuNzUKIyAgICAgICAgICAgICAgICAgICAgICAgICBiYSAgICAxLjI1CiMgICAgICAgICAgICAgICAgICAgICAgICAgZGEgICAgMS41NQojICAgICAgICAgICAgICAgICAgICAgICAgIGFhICAgIDEuNDUKIyAgICAgICAgICAgICAgICAgICAgICAgICBhYSAgICAxLjUKIyAgICAgICAgICAgICAgICAgICAgICAgICBjYSAgICAxLjMKIyAgICAgICAgICAgICAgICAgICAgICAgICBhYSAgICAxLjc1IiwgCiMgICAgICAgICAgICAgICAgIGhlYWRlciA9IFRSVUUsKQojIGQkbGFiZWwgPC0gcmVwKDEsIG5yb3coZCkpCiMgZSRsYWJlbCA8LSByZXAoMiwgbnJvdyhlKSkKIyBmID0gZGF0YS5mcmFtZShyYmluZChkLCBlKSkKIyAjI2YkY29sX2EgPSBwb2xsdXRhbnQKIyAjI2YkbGFiZWwgPSBsb2NhdGlvbgojIGJwID0gYm94cGxvdChjb2xfYn5sYWJlbCtjb2xfYSwgZGF0YSA9IGYsIGF0ID0gYygxLCAxLjgsIDMsIDMuOCwgNSwgNS44LCA3LjIsIDgpLCB4YXh0PSduJywgeWxpbSA9IGMoLjksIDEuOSksIGNvbCA9IGMoJ3doaXRlJywgJ2dyYXknKSkKIyBheGlzKHNpZGU9MSwgYXQ9YygxLjQsIDMuNCwgNS40LCA3LjYpLCBsYWJlbHM9YygnYWEnLCAnYmEnLCAnY2EnLCAnZGEnKSwgdGl0bGUoJ3ByYWN0aWNlJykpCmBgYAoKCmBgYHtyfQojcGxvdHMgVkFNUC1zZXEgc2NvcmUgdnMgYWJ1bmRhbmNlX2NsYXNzCmxpYnJhcnkoZ2dwbG90MikKcmVxdWlyZShncmlkRXh0cmEpCgpWQU1QX2FidW5kYW5jZSA8LSBnZ3Bsb3QoZmYsIGFlcyh4PWFidW5kYW5jZV9jbGFzcywgeT1zY29yZSwgZmlsbD1wcm90ZWluKSkgKyBnZW9tX3Zpb2xpbihkcmF3X3F1YW50aWxlcyA9IDAuNSkreWxhYigiVkFNUC1zZXEgc2NvcmUiKSt4bGFiKCJBYnVuZGFuY2UgQ2xhc3MiKSt0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJncmV5IiksIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImdyZXkiKSkrZ2d0aXRsZSgiVkFNUC1zZXEgc2NvcmVzIGZvciBlYWNoIGFidW5kYW5jZSBjbGFzc2lmaWNhdGlvbiIpK2dlb21fcG9pbnQoZGF0YT1kYXRhLmZyYW1lKHg9Ind0LWxpa2UiLCB5PTEsIHByb3RlaW4gPSAiUFRFTiIpLCBhZXMoeCx5KSwgY29sb3VyPSJibGFjayIsIHNpemU9MS41LCBzaG93LmxlZ2VuZD1GQUxTRSkrYW5ub3RhdGUoInRleHQiLCB4ID0gInd0LWxpa2UiLCB5PTEuMDksIGxhYmVsID0gIldUIixjb2xvdXI9ICJibGFjayIsIHNpemUgPSA0KSArIHNjYWxlX3lfY29udGludW91cyhtaW5vcl9icmVha3MgPSBzZXEoLTIsIDIsIC4yNSkpCnBsb3QoVkFNUF9hYnVuZGFuY2UpCmBgYApgYGB7cn0KI3Bsb3RzIGhlbGl4IHZzIHNjb3JlIGZvciBQVEVOCmdncGxvdChwdGVuMV9kYXRhLCBhZXMoeD1hcy5mYWN0b3IoaGVsaXgpLCB5PXNjb3JlKSkgKyBnZW9tX2JveHBsb3QoKSt5bGFiKCJWQU1QLXNlcSBzY29yZSIpCmBgYApgYGB7cn0KI2NvbWJpbmluZyBwdGVuMV9kYXRhIGFuZCB0cG10MV9kYXRhIGludG8gb25lIGxhcmdlIGRhdGEgZnJhbWUsIGRpZmZlcmVudGlhdGUgYmV0d2VlbiB0aGUgdHdvIHcvIGNvbHVtbiAncHJvdGVpbicgd2hpY2ggc3BlY2lmaWVzICdQVEVOJyBvciAnVFBNVCcKcHRlbjFfZGF0YSRwcm90ZWluIDwtIHJlcCgiUFRFTiIsIG5yb3cocHRlbjFfZGF0YSkpCnRwbXQxX2RhdGEkcHJvdGVpbiA8LSByZXAoIlRQTVQiLCBucm93KHRwbXQxX2RhdGEpKQpjb21tb25fY29scyA8LSBpbnRlcnNlY3QoY29sbmFtZXMocHRlbjFfZGF0YSksIGNvbG5hbWVzKHRwbXQxX2RhdGEpKQpjb21iX2RhdGEgPSByYmluZChzdWJzZXQocHRlbjFfZGF0YSwgc2VsZWN0ID0gY29tbW9uX2NvbHMpLCBzdWJzZXQodHBtdDFfZGF0YSwgc2VsZWN0ID0gY29tbW9uX2NvbHMpKQoKI3Bsb3RzIGhlbGl4IHZzIHNjb3JlIGZvciBQVEVOIGFuZCBUUE1UIHNpZGUgYnkgc2lkZQojbm8gTkEKCmNvbWJfZGF0YV9oZWxpeCA8LSBjb21iX2RhdGFbIWlzLm5hKGNvbWJfZGF0YSRoZWxpeCksXQojY2hlY2sgdG8gc2VlIHdoZXJlIDM3NTkgcm93cyB3ZW50IG9mZiB0bwpjayA8LSBjb21iX2RhdGFfaGVsaXhbIWlzLm5hKGNvbWJfZGF0YV9oZWxpeCRhYnVuZGFuY2VfY2xhc3MpLF0KY29tYl9kYXRhX3NoZWV0IDwtIGNvbWJfZGF0YVshaXMubmEoY29tYl9kYXRhJHNoZWV0KSxdCmNrMSA8LSBjb21iX2RhdGFfc2hlZXRbIWlzLm5hKGNvbWJfZGF0YV9zaGVldCRhYnVuZGFuY2VfY2xhc3MpLF0KCmhfcGxvdCA8LSBnZ3Bsb3QoY2ssIGFlcyh4PWFzLmZhY3RvcihoZWxpeCksIHk9c2NvcmUsIGZpbGw9cHJvdGVpbikpICsgZ2VvbV92aW9saW4oZGF0YT1zdWJzZXQoY2ssIGhlbGl4PT0xKSwgZHJhd19xdWFudGlsZXMgPSBjKDAuNSkpICsgZ3VpZGVzKGZpbGw9RkFMU0UpICsgeGxhYigiQWxwaGEgSGVsaXgiKSArIHlsYWIoIlZBTVAtc2VxIHNjb3JlIikgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSkgKyBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtLjcsIDIuMDMpKQoKc19wbG90IDwtIGdncGxvdChjazEsIGFlcyh4PWFzLmZhY3RvcihzaGVldCksIHk9c2NvcmUsIGZpbGw9cHJvdGVpbikpICsgZ2VvbV92aW9saW4oZGF0YT1zdWJzZXQoY2sxLCBzaGVldD09MSksIGRyYXdfcXVhbnRpbGVzID0gYygwLjUpKSArICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSkgKyB4bGFiKCJCZXRhIFNoZWV0IikgKyBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtLjcsIDIuMDMpKSArIGd1aWRlcyhmaWxsPUZBTFNFKSAKCm5fcGxvdCA8LSBnZ3Bsb3QoY2ssIGFlcyh4PWFzLmZhY3RvcihoZWxpeCksIHk9c2NvcmUsIGZpbGw9cHJvdGVpbikpICsgZ2VvbV92aW9saW4oZGF0YT1zdWJzZXQoY2ssIGhlbGl4PT0wICYgc2hlZXQ9PTApLCBkcmF3X3F1YW50aWxlcyA9IGMoIDAuNSkpICsgdGhlbWUoIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLCBsZWdlbmQuanVzdGlmaWNhdGlvbj1jKDEsMCksIGxlZ2VuZC5wb3NpdGlvbj1jKC40OSwuNzUpLCBsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLCBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSkgKyB4bGFiKCJPdGhlciIpICsgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLS43LCAyLjAzKSkKCiNwdXQgdGhlIHBsb3RzIHNpZGUgYnkgc2lkZQpjb21iaW5lZCA8LSBncmlkLmFycmFuZ2UoaF9wbG90LCBzX3Bsb3QsIG5fcGxvdCwgbmNvbD0zLCB0b3AgPSAiVmFyaWFudCBzY29yZXMgaW4gcmVsYXRpb24gdG8gcG9zaXRpb24gaW4gcHJvdGVpbiIpCiMjIyMjIyMjIyMjIyMjCiMjc2F2ZSBhcyBwZGYKCiMgcGRmKCJ2aW9saW5fVmFyaWFudF9zY29yZXNfdnMucGRmIikKIyBwbG90KGNvbWJpbmVkKQojIHBsb3QoVkFNUF9hYnVuZGFuY2UpCiMgZGV2Lm9mZigpCiMjIyMjIyMjIyMjIyMjCiN3b3JrcyB0byBzYXZlIHNpbmdsZQojZ2dzYXZlKCJWYXJpYW50X3Njb3Jlc19wcm90ZWluX3Bvc2l0aW9uLnBkZiIsIHBsb3QgPSBjb21iaW5lZCwgZGV2aWNlID0gInBkZiIsIHBhdGggPSAiL1VzZXJzL2dvMmFseXNzYS9EZXNrdG9wLyIsIHNjYWxlID0gMi42LCBkcGkgPSAicmV0aW5hIikKCmBgYAoKYGBge3J9CmxpYnJhcnkocHJhY21hKQojIGdyYXBoIFZBTVAtc2VxIHNjb3JlcyByZWxhdGl2ZSB0byB2YXJpYW50IHBvc2l0aW9uIGluIHByb3RlaW4KI3B0ZW4KcHRlbjFfcHJvY193dCA8LSBwdGVuMV9wcm9jWyFpcy5uYShwdGVuMV9wcm9jJHBvc2l0aW9uKSxdCnB0ZW4xX3Byb2Nfd3Qkc2Vjb25kYXJ5X3N0cnVjdCA8LSBpZmVsc2UoaXMubmEocHRlbjFfcHJvY193dCRoZWxpeCksICJ1bmtub3duIiwKICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHB0ZW4xX3Byb2Nfd3QkaGVsaXg9PTEsICJoZWxpeCIsCiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShwdGVuMV9wcm9jX3d0JHNoZWV0PT0xLCAic2hlZXQiLAogICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UocHRlbjFfcHJvY193dCRoZWxpeD09MCwgIm5laXRoZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biIpKSkpCnB0ZW5fcG9zIDwtIGdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeD1wb3NpdGlvbiwgeT1zY29yZSwgY29sb3VyPXNlY29uZGFyeV9zdHJ1Y3QpKSsgZ2VvbV9wb2ludChzaXplPS4zKSArIHNjYWxlX3hfY29udGludW91cyhtaW5vcl9icmVha3MgPSBzZXEoMCwgNDIwLCA1KSkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiNGRjQ4NDgiLCAiIzAwQzg1MyIsICIjNTc1N0ZGIiwgIiNBOUE5QTkiKSkgK3lsYWIoIlZBTVAtc2VxIHNjb3JlIikreGxhYigiUG9zaXRpb24gaW4gUFRFTiIpK2xhYnMoY29sb3VyPSJTZWNvbmRhcnkgU3RydWN0dXJlIikrZ2d0aXRsZSgiUFRFTiBzY29yZXMgaW4gcmVsYXRpb24gdG8gcHJvdGVpbiBzdHJ1Y3R1cmUiKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD0yNywgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9NTUsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTcwLCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD04NSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MTY0LjUsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTIxMiwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MjY3LjUsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTM0My41LCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKQoKI3RwbXQKdHBtdDFfcHJvY193dCA8LSB0cG10MV9wcm9jWyFpcy5uYSh0cG10MV9wcm9jJHBvc2l0aW9uKSxdCnRwbXQxX3Byb2Nfd3Qkc2Vjb25kYXJ5X3N0cnVjdCA8LSBpZmVsc2UoaXMubmEodHBtdDFfcHJvY193dCRoZWxpeCksICJ1bmtub3duIiwKICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHRwbXQxX3Byb2Nfd3QkaGVsaXg9PTEsICJoZWxpeCIsCiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0cG10MV9wcm9jX3d0JHNoZWV0PT0xLCAic2hlZXQiLAogICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodHBtdDFfcHJvY193dCRoZWxpeD09MCwgIm5laXRoZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biIpKSkpCnRwbXRfcG9zIDwtIGdncGxvdCh0cG10MV9wcm9jX3d0LCBhZXMoeD1wb3NpdGlvbiwgeT1zY29yZSwgY29sb3VyPXNlY29uZGFyeV9zdHJ1Y3QpKSsgZ2VvbV9wb2ludChzaXplPS4zKSArIHNjYWxlX3hfY29udGludW91cyhtaW5vcl9icmVha3MgPSBzZXEoMCwgNDA1LCA1KSkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiNGRjQ4NDgiLCAiIzAwQzg1MyIsICIjNTc1N0ZGIiwgIiNBOUE5QTkiKSkgK3lsYWIoIlZBTVAtc2VxIHNjb3JlIikreGxhYigiUG9zaXRpb24gaW4gVFBNVCIpK2xhYnMoY29sb3VyPSJTZWNvbmRhcnkgU3RydWN0dXJlIikrZ2d0aXRsZSgiVFBNVCBzY29yZXMgaW4gcmVsYXRpb24gdG8gcHJvdGVpbiBzdHJ1Y3R1cmUiKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD00NywgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9NzgsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTEyMi41LCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD0xNDAsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTE2NSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MTk0LCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD0yMDksIGNvbG9yPSJibGFjayIsIHNpemU9LjEpCgp0cG10X2NvbG9ycyA8LSB0cG10MV9wcm9jX3d0CiNbb3JkZXIocG9zaXRpb24sIHZhcmlhbnQpLF0KdHBtdF9jb2xvcnMkZmFjdCA8LSByZXAoMTAsIG5yb3codHBtdF9jb2xvcnMpKQp0ZW1wIDwtIDEKZm9yKGkgaW4gMToobGVuZ3RoKHRwbXRfY29sb3JzJGZhY3QpLTEpKSB7CiAgaWYgKHRwbXRfY29sb3JzJHNlY29uZGFyeV9zdHJ1Y3RbaV0gIT0gdHBtdF9jb2xvcnMkc2Vjb25kYXJ5X3N0cnVjdFtpKzFdKSB7CiAgICB0cG10X2NvbG9ycyRmYWN0W2ldIDwtIHRlbXAKICAgIHRlbXAgPC0gdGVtcCArIDEKICB9IGVsc2UgewogIHRwbXRfY29sb3JzJGZhY3RbaV0gPC0gdGVtcAogIH0KfQp0cG10X2NvbG9ycyRmYWN0W2xlbmd0aCh0cG10X2NvbG9ycyRmYWN0KV0gPC0gdGVtcAoKIyBjYyA8LSAwCiMgZm9yKGkgaW4gMToobGVuZ3RoKHRwbXRfY29sb3JzJGZhY3QpLTEpKSB7CiMgICBpZiAodHBtdF9jb2xvcnMkZmFjdFtpXSAhPSB0cG10X2NvbG9ycyRmYWN0W2krMV0pIHsKIyAgICAgcHJpbnQoY2MpCiMgICAgIGNjIDwtIDAKIyAgIH0gZWxzZSB7CiMgICAgIGNjIDwtIGNjICsgMQojICAgfQojIH0KCnRwbXRfcG9zX3ZwIDwtIGdncGxvdCh0cG10X2NvbG9ycywgYWVzKHg9cG9zaXRpb24sIHk9c2NvcmUpKSsgZ2VvbV92aW9saW4oZGF0YT10cG10X2NvbG9yc1tjKDE6Mjc4MywgMjc5ODo0MDAwKSxdLCBhZXMoZmlsbD1hcy5jaGFyYWN0ZXIoZmFjdCksIGNvbG91ciA9IGZhY3RvcihUUlVFKSksIGRyYXdfcXVhbnRpbGVzID0gYygwLjUpLCBzY2FsZSA9ICJ3aWR0aCIpICsgCnNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIxIiA9ICIjQTlBOUE5IiwgIjIiID0gIiMwMEM4NTMiLCAiMyIgPSAiI0ZGNDg0OCIsICI0IiA9ICIjMDBDODUzIiwiNSIgPSAiI0ZGNDg0OCIsICI2IiA9ICIjMDBDODUzIiwiNyIgPSAiIzU3NTdGRiIsICI4IiA9ICIjMDBDODUzIiwiOSIgPSAiI0ZGNDg0OCIsIjEwIiA9ICIjMDBDODUzIiwiMTEiID0gIiM1NzU3RkYiLCAiMTIiID0gIiMwMEM4NTMiLCIxMyIgPSAiI0ZGNDg0OCIsICIxNCIgPSAiIzAwQzg1MyIsICIxNSIgPSAiIzU3NTdGRiIsICIxNiIgPSAiIzAwQzg1MyIsICIxNyIgPSAiIzU3NTdGRiIsICIxOCIgPSAiIzAwQzg1MyIsICIxOSIgPSAiIzU3NTdGRiIsICIyMCIgPSAiIzAwQzg1MyIsICIyMSIgPSAiIzU3NTdGRiIsICIyMiIgPSAiIzAwQzg1MyIsICIyMyIgPSAiI0ZGNDg0OCIsICIyNCIgPSAiIzU3NTdGRiIsICIyNSIgPSAiIzAwQzg1MyIsICIyNiIgPSAiI0ZGNDg0OCIsICIyNyIgPSAiIzAwQzg1MyIsICIyOCIgPSAiIzU3NTdGRiIsICIyOSIgPSAiIzAwQzg1MyIsICIzMCIgPSAiIzU3NTdGRiIsICIzMSIgPSAiIzAwQzg1MyIpKSArIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiYmxhY2siKSkgKyBzY2FsZV94X2NvbnRpbnVvdXMobWlub3JfYnJlYWtzID0gc2VxKDAsIDQwNSwgNSkpICsgeWxhYigiVkFNUC1zZXEgc2NvcmUiKSt4bGFiKCJQb3NpdGlvbiBpbiBUUE1UIikrbGFicyhjb2xvdXI9IlNlY29uZGFyeSBTdHJ1Y3R1cmUiKStnZ3RpdGxlKCJUUE1UIHNjb3JlcyBpbiByZWxhdGlvbiB0byBwcm90ZWluIHN0cnVjdHVyZSIpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTQ3LCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD03OCwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MTIyLjUsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTE0MCwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MTY1LCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD0xOTQsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTIwOSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkKcGxvdChwdGVuX3BvcykKcGxvdCh0cG10X3BvcykKcGxvdCh0cG10X3Bvc192cCkKCgpgYGAKYGBge3J9CiMgZ3JhcGggVkFNUC1zZXEgc2NvcmVzIHJlbGF0aXZlIHRvIHZhcmlhbnQgcG9zaXRpb24gaW4gcHJvdGVpbgojcHRlbgpwdGVuMV9oYm9uZCA8LSBwdGVuMV9wcm9jWyFpcy5uYShwdGVuMV9wcm9jJGhib25kX3N1bSksXQpwdGVuMV9oYm9uZCRzZWNvbmRhcnlfc3RydWN0IDwtIGlmZWxzZShpcy5uYShwdGVuMV9oYm9uZCRoZWxpeCksICJ1bmtub3duIiwKICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHB0ZW4xX2hib25kJGhlbGl4PT0xLCAiaGVsaXgiLAogICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UocHRlbjFfaGJvbmQkc2hlZXQ9PTEsICJzaGVldCIsCiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShwdGVuMV9oYm9uZCRoZWxpeD09MCwgIm5laXRoZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biIpKSkpCnB0ZW5fcGxvdF9oYm9uZCA8LSBnZ3Bsb3QocHRlbjFfaGJvbmQsIGFlcyh4PWhib25kX3N1bSwgeT1zY29yZSwgY29sb3VyPXNlY29uZGFyeV9zdHJ1Y3QpKSsgZ2VvbV9wb2ludChhbHBoYT0wLjQpICsgeWxhYigiVkFNUC1zZXEgc2NvcmUiKSt4bGFiKCJEU1NQIFN1bSBvZiBoeWRyb2dlbiBib25kcyIpK2dndGl0bGUoIlBURU4gc2NvcmVzIGluIHJlbGF0aW9uIHRvIGh5ZHJvZ2VuIGJvbmRpbmciKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiI0ZGNDg0OCIsICIjNjk2OTY5IiwgIiM1NzU3RkYiKSkgKyBsYWJzKGNvbG91cj0iU2Vjb25kYXJ5IFN0cnVjdHVyZSIpCnBsb3QocHRlbl9wbG90X2hib25kKQoKcHRlbl9wbG90X2hib25kMSA8LSBnZ3Bsb3QocHRlbjFfaGJvbmQsIGFlcyh4PWhib25kX3N1bSwgeT1zY29yZSkpKyBnZW9tX3BvaW50KGFscGhhID0gMC4yKSArIHlsYWIoIlZBTVAtc2VxIHNjb3JlIikreGxhYigiRFNTUCBTdW0gb2YgaHlkcm9nZW4gYm9uZHMiKStnZ3RpdGxlKCJQVEVOIHNjb3JlcyBpbiByZWxhdGlvbiB0byBoeWRyb2dlbiBib25kaW5nIikKCiMgd2FzIGluIGFlcywgZ2dwbG90IGZ1bmN0aW9uIGNhbGwgLS0tPiBjb2xvdXI9c2Vjb25kYXJ5X3N0cnVjdAojc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjRkY0ODQ4IiwgIiMwMEM4NTMiLCAiIzU3NTdGRiIsICIjQTlBOUE5IikpICsgbGFicyhjb2xvdXI9IlNlY29uZGFyeSBTdHJ1Y3R1cmUiKSsKCnBsb3QocHRlbl9wbG90X2hib25kMSkKYGBgCgpgYGB7cn0KI3N0b3JlIGxhc3QgZm91cgoKIyBwZGYoInBvc2l0aW9uX2h5ZHJvZ2VuX2JvbmRzLnBkZiIpCiMgcGxvdChwdGVuX3BvcykKIyBwbG90KHRwbXRfcG9zKQojIHBsb3QocHRlbl9wbG90X2hib25kKQojIHBsb3QocHRlbl9wbG90X2hib25kMSkKIyBkZXYub2ZmKCkKCmBgYApgYGB7cn0KbmFtZSA8LSBjKCdBbGEnLCAnQXJnJywgJ0FzbicsICdBc3AnLCAnQ3lzJywgJ0dsdScsICdHbG4nLCAnR2x5JywgJ0hpcycsICdJbGUnLCAnTGV1JywgJ0x5cycsICdNZXQnLCAnUGhlJywgJ1BybycsICdTZXInLCAnVGhyJywgJ1RycCcsICdUeXInLCAnVmFsJykKcXVhbGl0eSA8LSBjKCdIeWRyb3Bob2JpYycsICdCYXNpYycsICdQb2xhciBOZXV0cmFsJywgJ0FjaWRpYycsICdQb2xhciBOZXV0cmFsJywgJ0FjaWRpYycsICdQb2xhciBOZXV0cmFsJywgJ0dseWNpbmUnLCAnQmFzaWMnLCAnSHlkcm9waG9iaWMnLCAnSHlkcm9waG9iaWMnLCAnQmFzaWMnLCAnSHlkcm9waG9iaWMnLCAnSHlkcm9waG9iaWMnLCAnSHlkcm9waG9iaWMnLCAnUG9sYXIgTmV1dHJhbCcsICdQb2xhciBOZXV0cmFsJywgJ0h5ZHJvcGhvYmljJywgJ0h5ZHJvcGhvYmljJywgJ0h5ZHJvcGhvYmljJykKI2FidW5kYW5jZSA8LSBnZXQgYmV0dGVyIHNjYWxlCmFidW5kYW5jZSA8LSBjKDAuMDg4NCwgMC4wNTcsIDAuMDQxNywgMC4wNTM5LCAwLjAxMjQsIDAuMDYyNCwgMC4wMzgyLCAwLjA3MDMsIDAuMDIyMCwgMC4wNTk1LCAwLjA5OTQsIDAuMDUyNywgMC4wMjM3LCAwLjA0LCAwLjA0NzEsIDAuMDY3MiwgMC4wNTQzLCAwLjAxMjEsIDAuMDMsIDAuMDY3NykKI2lzb2VsZWN0cmljIHBvaW50IDwtIHVua25vd24gc291cmNlIChuY2JpKQppc29lbGVjdHJpYyA8LSBjKDYsIDEwLjgsIDUuNCwgMywgNSwgMy4yLCA1LjcsIDYsIDcuNiwgNiwgNiwgOS43LCA1LjcsIDUuNSwgNi4zLCA1LjcsIDUuNiwgNS45LCA1LjcsIDYuMCkKaHBfa19kIDwtIGMoMS44LCAtNC41LCAtMy41LCAtMy41LCAyLjUsIC0zLjUsIC0zLjUsIC0wLjQsIC0zLjIsIDQuNSwgMy44LCAtMy45LCAxLjksIDIuOCwgLTEuNiwgLTAuOCwgLTAuNywgLTAuOSwgLTEuMywgNC4yKQpocF9qYW5pbiA8LWMoMC4zLCAtMS40LCAtMC41LCAtMC42LCAwLjksIC0wLjcsIC0wLjcsIDAuMywgLTAuMSwgMC43LCAwLjUsIC0xLjgsIDAuNCwgMC41LCAtMC4zLCAtMC4xLCAtMC4yLCAwLjMsIC0wLjQsIDAuNikKI01vbmVyYSBldCBhbC4sIEouIFByb3RlaW4gU2NpIChwcm8gKC00NikgbWF5IGJlIHNrZXRjaCkKaHBfcGg3IDwtIGMoNDEsIC0xNCwgLTI4LCAtNTUsIDQ5LCAtMzEsIC0xMCwgMCwgOCwgOTksIDk3LCAtMjMsIDc0LCAxMDAsIC00NiwgLTUsIDEzLCA5NywgNjMsIDc2KQpoX2JvbmRzIDwtIGMoMCwgNywgNSwgNCwgMCwgNCwgNSwgMCwgMywgMCwgMCwgMywgMCwgMCwgMCwgMywgMywgMSwgMywgMCkKbW9sX3dlaWdodCA8LWMoNzEsIDE1NiwgMTE0LCAxMTUsIDEwMywgMTI5LCAxMjgsIDU3LCAxMzcsIDExMywgMTEzLCAxMjgsIDEzMSwgMTQ3LCA5NywgODcsIDEwMSwgMTg2LCAxNjMsIDk5KQoKYW1pbm9fYWNpZHMuZGF0YSA8LSBkYXRhLmZyYW1lKG5hbWUsIHF1YWxpdHksIGFidW5kYW5jZSwgaXNvZWxlY3RyaWMsIGhwX2tfZCwgaHBfamFuaW4sIGhwX3BoNywgaF9ib25kcywgbW9sX3dlaWdodCkKCmBgYApgYGB7cn0KI0lkZW50aWZ5aW5nIGl0ZW1zIGluIHRhaWwgdG8gaW52ZXN0aWdhdGUKcHRlbjFfbm9uc2Vuc2UgPC0gc3Vic2V0KHB0ZW4xX3Byb2MsIGNsYXNzID09ICJub25zZW5zZSIpCnRwbXQxX25vbnNlbnNlIDwtIHN1YnNldCh0cG10MV9wcm9jLCBjbGFzcyA9PSAibm9uc2Vuc2UiKQpwdGVuMV9zeW5vbiA8LSBzdWJzZXQocHRlbjFfcHJvYywgY2xhc3MgPT0gInN5bm9ueW1vdXMiKQp0cG10MV9zeW5vbiA8LSBzdWJzZXQodHBtdDFfcHJvYywgY2xhc3MgPT0gInN5bm9ueW1vdXMiKQoKcHRlbjFfbm9fbWlzc2Vuc2UgPC0gc3Vic2V0KHB0ZW4xX3Byb2MsIGNsYXNzID09ICJzeW5vbnltb3VzIiB8IGNsYXNzID09ICJub25zZW5zZSIpCgpnZ3Bsb3QocHRlbjFfbm9uc2Vuc2UsIGFlcyh4PXNjb3JlKSkgKyBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aD0uMDEsIGNvbG91cj0iYmx1ZSIsIGZpbGw9IndoaXRlIikgCiMrIGdlb21fZGVuc2l0eSgpCmdncGxvdChwdGVuMV9zeW5vbiwgYWVzKHg9c2NvcmUpKSArIGdlb21faGlzdG9ncmFtKGJpbndpZHRoPS4wMSwgY29sb3VyPSJyZWQiLCBmaWxsPSJ3aGl0ZSIpCgpnZ3Bsb3QocHRlbjFfcHJvY193dCwgYWVzKHg9c2NvcmUpKSArIGdlb21faGlzdG9ncmFtKGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsY2xhc3MgPT0gIm5vbnNlbnNlIiksIGZpbGwgPSAicmVkIiwgYWxwaGEgPSAwLjUsIGJpbndpZHRoPS4wMSkgKyBnZW9tX2hpc3RvZ3JhbShkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LGNsYXNzID09ICJzeW5vbnltb3VzIiksIGZpbGwgPSAiYmx1ZSIsIGFscGhhID0gMC41LCBiaW53aWR0aD0uMDEpICsgZ2VvbV9oaXN0b2dyYW0oZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCxjbGFzcyA9PSAibWlzc2Vuc2UiKSwgZmlsbCA9ICJncmVlbiIsIGFscGhhID0gMC4yLCBiaW53aWR0aD0uMDEpCgpnZ3Bsb3QocHRlbjFfbm9fbWlzc2Vuc2UsIGFlcyh4PXNjb3JlKSkgKyBnZW9tX2hpc3RvZ3JhbShkYXRhPXN1YnNldChwdGVuMV9ub19taXNzZW5zZSxjbGFzcyA9PSAibm9uc2Vuc2UiKSwgZmlsbCA9ICJyZWQiLCBhbHBoYSA9IDAuNSwgYmlud2lkdGg9LjAxKSArIGdlb21faGlzdG9ncmFtKGRhdGE9c3Vic2V0KHB0ZW4xX25vX21pc3NlbnNlLGNsYXNzID09ICJzeW5vbnltb3VzIiksIGZpbGwgPSAiYmx1ZSIsIGFscGhhID0gMC41LCBiaW53aWR0aD0uMDEpCgpnZ3Bsb3QodHBtdDFfc3lub24sIGFlcyh4PXNjb3JlKSkgKyBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aD0uMDEsIGNvbG91cj0icmVkIiwgZmlsbD0id2hpdGUiKQpnZ3Bsb3QodHBtdDFfbm9uc2Vuc2UsIGFlcyh4PXNjb3JlKSkgKyBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aD0uMDEsIGNvbG91cj0iYmx1ZSIsIGZpbGw9IndoaXRlIikKYGBgCmBgYHtyfQpub25zZW5zZV90YWlsIDwtIHN1YnNldChwdGVuMV9ub25zZW5zZSwgc2NvcmUgPiAwLjU1KQpzeW5vbl90YWlsIDwtIHN1YnNldChwdGVuMV9zeW5vbiwgc2NvcmUgPCAwLjYpCm5vbnNlbnNlX3RhaWwkc2Vjb25kYXJ5X3N0cnVjdCA8LSBpZmVsc2UoaXMubmEobm9uc2Vuc2VfdGFpbCRoZWxpeCksICJ1bmtub3duIiwKICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKG5vbnNlbnNlX3RhaWwkaGVsaXg9PTEsICJoZWxpeCIsCiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShub25zZW5zZV90YWlsJHNoZWV0PT0xLCAic2hlZXQiLAogICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uobm9uc2Vuc2VfdGFpbCRoZWxpeD09MCwgIm5laXRoZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biIpKSkpCnN5bm9uX3RhaWwkc2Vjb25kYXJ5X3N0cnVjdCA8LSBpZmVsc2UoaXMubmEoc3lub25fdGFpbCRoZWxpeCksICJ1bmtub3duIiwKICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN5bm9uX3RhaWwkaGVsaXg9PTEsICJoZWxpeCIsCiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzeW5vbl90YWlsJHNoZWV0PT0xLCAic2hlZXQiLAogICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3lub25fdGFpbCRoZWxpeD09MCwgIm5laXRoZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biIpKSkpCgojZGF0YVtyb3csY29sdW1uXQpuX3RhaWwgPC0gbm9uc2Vuc2VfdGFpbFssYygxLDIsNywzMCwxMjcpXQpzX3RhaWwgPC0gc3lub25fdGFpbFssYygxLDIsNywzMCwxMjcpXQpuX3RhaWwkYnBfcG9zIDwtIChuX3RhaWwkcG9zaXRpb24tMSkqMwpzX3RhaWwkYnBfcG9zIDwtIChzX3RhaWwkcG9zaXRpb24tMSkqMwoKbl90YWlsCnNfdGFpbApgYGAKYGBge3J9CiNqdXN0IGluIGNhc2UgdGhlcmUgaXMgYSBkaXNjZXJuaWJsZSBwYXR0ZXJuCnNfdGFpbF9wb3MgPC0gZ2dwbG90KHNfdGFpbCwgYWVzKHg9cG9zaXRpb24sIHk9c2NvcmUsIGNvbG91cj1zZWNvbmRhcnlfc3RydWN0KSkrIGdlb21fcG9pbnQoc2l6ZT0uMykgKyBzY2FsZV94X2NvbnRpbnVvdXMobWlub3JfYnJlYWtzID0gc2VxKDAsIDQwNSwgNSkpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjRkY0ODQ4IiwgIiMwMEM4NTMiLCAiIzU3NTdGRiIsICIjQTlBOUE5IikpICt5bGFiKCJWQU1QLXNlcSBzY29yZSIpK3hsYWIoIlBvc2l0aW9uIGluIFBURU4iKStsYWJzKGNvbG91cj0iU2Vjb25kYXJ5IFN0cnVjdHVyZSIpK2dndGl0bGUoIlBURU4gc3lub255bW91cyB2YXJpYW50IHRhaWwgc2NvcmVzIGluIHJlbGF0aW9uIHRvIHByb3RlaW4gc3RydWN0dXJlIikgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9NDcsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTc4LCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD0xMjIuNSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MTQwLCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD0xNjUsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTE5NCwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MjA5LCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKQpwbG90KHNfdGFpbF9wb3MpCgojaGVscCB2aXN1YWxpemluZyBOTUQgcnVsZXMKbl90YWlsX3BvcyA8LSBnZ3Bsb3Qobl90YWlsLCBhZXMoeD1wb3NpdGlvbiwgeT1zY29yZSwgY29sb3VyPXNlY29uZGFyeV9zdHJ1Y3QpKSsgZ2VvbV9wb2ludChzaXplPS4zKSArIHNjYWxlX3hfY29udGludW91cyhtaW5vcl9icmVha3MgPSBzZXEoMCwgNDA1LCA1KSkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiNGRjQ4NDgiLCAiIzAwQzg1MyIsICIjNTc1N0ZGIiwgIiNBOUE5QTkiKSkgK3lsYWIoIlZBTVAtc2VxIHNjb3JlIikreGxhYigiUG9zaXRpb24gaW4gUFRFTiIpK2xhYnMoY29sb3VyPSJTZWNvbmRhcnkgU3RydWN0dXJlIikrZ2d0aXRsZSgiUFRFTiBub25zZW5zZSB2YXJpYW50IHRhaWwgc2NvcmVzIGluIHJlbGF0aW9uIHRvIHByb3RlaW4gc3RydWN0dXJlIikgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9NDcsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTc4LCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD0xMjIuNSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MTQwLCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD0xNjUsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTE5NCwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MjA5LCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKQpwbG90KG5fdGFpbF9wb3MpCmBgYAoKYGBge3J9CnNfdGFpbCRwcm9iX0FHX0dUIDwtIGMoMCwgMS82LCAxLzIsIDAsIDEvMiwgMS82KQpzX3RhaWwkcHJvYl90aXR2IDwtIGMoMCwgMi8zLCAyLzMsIDAsIDIvMywgMS8zKQpnZ3Bsb3Qobl90YWlsLCBhZXMoeD1wb3NpdGlvbix5PXNjb3JlKSkgKyBnZW9tX3BvaW50KCkgKyBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKQpnZ3Bsb3Qoc190YWlsLCBhZXMoeD1wcm9iX3RpdHYseT1zY29yZSkpICsgZ2VvbV9wb2ludCgpICsgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikKZ2dwbG90KHNfdGFpbCwgYWVzKHk9cHJvYl90aXR2LHg9c2NvcmUpKSArIGdlb21fcG9pbnQoKSArIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpCnJzcSA8LSBmdW5jdGlvbiAoeCwgeSkgY29yKHgsIHkpXjIKbl9yc3EgPC0gcnNxKG5fdGFpbCRwb3NpdGlvbiwgc190YWlsJHNjb3JlKQpzX3JzcSA8LSByc3Eoc190YWlsJHByb2JfdGl0diwgc190YWlsJHNjb3JlKQpuX3JzcQpzX3JzcQojbm8gcmVsYXRpb25zaGlwLi4uCmBgYAoKYGBge3J9CiMgcHRlbjFfcHJvY193dCRzZWNvbmRhcnlfc3RydWN0IDwtIGlmZWxzZShpcy5uYShwdGVuMV9wcm9jX3d0JGhlbGl4KSwgInVua25vd24iLAojICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShwdGVuMV9wcm9jX3d0JGhlbGl4PT0xLCAiaGVsaXgiLAojICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShwdGVuMV9wcm9jX3d0JHNoZWV0PT0xLCAic2hlZXQiLAojICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShwdGVuMV9wcm9jX3d0JGhlbGl4PT0wLCAibmVpdGhlciIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24iKSkpKQoKI3N0YXJ0IHBvc2l0aW9uIHdpdGhpbiBwdGVuIGdlbmUKIyBuX3RhaWwkc19wb3MgPC0gaWZlbHNlKChuX3RhaWwkYnBfcG9zX2N1bSk+ZTEsICgKIyAgIGlmZWxzZSgobl90YWlsJGJwX3Bvc19jdW0pID4gKGUxK2UyKSwgKAojICAgICBpZmVsc2UoKG5fdGFpbCRicF9wb3NfY3VtKSA+IChlMStlMitlMyksICgKIyAgICAgICBpZmVsc2UoKG5fdGFpbCRicF9wb3NfY3VtKSA+IChlMStlMitlMyksICgKIyAgICAgICAKIyAgICAgICApLCAobl90YWlsJGJwX3Bvc19jdW0rZTRfcykpCiMgICAgICksIChuX3RhaWwkYnBfcG9zX2N1bStlM19zKSkKIyAgICksIChuX3RhaWwkYnBfcG9zX2N1bStlMl9zKSkKIyApLCAobl90YWlsJGJwX3Bvc19jdW0rZTFfcykpCgojZW5kIHBvc2l0aW9uIHdpdGhpbiBwdGVuIGdlbmUKCiN3aXRoaW4gMiBhbWlubyBhY2lkcyBvZiBqdW5jdGlvbgoKCiMgI2UxX3MgaXMgdGhlIGZpcnN0IGJwIG9mIHRoZSBmaXJzdCBleG9uCiMgZTFfcyA9IDg5NjI0MjI3CiMgI2UxX2UgaXMgdGhlIGxhc3QgYnAgb2YgdGhlIGZpcnN0IGV4b24sIAojIGUxX2UgPSA4OTYyNDMwNQojICNlMSBpcyBsZW5ndGggaW4gYnAKIyBlbCA9IDc5CiMgZTIgPSA4NQojIGUzID0gNDUKIyBlNCA9IDQ0CiMgZTUgPSAyMzkKIyBlNiA9IDE0MgojIGU3ID0gMTY3CiMgZTggPSAyMjUKIyBlOSA9IDE4NgojIGUyX3MgPSA4OTY1Mzc4MgojIGUyX2UgPSA4OTY1Mzg2NgojIGUzX3MgPSA4OTY4NTI3MAkKIyBlM19lID0gODk2ODUzMTQJCiMgZTRfcyA9IDg5NjkwODAzCiMgZTRfZSA9IDg5NjkwODQ2CiMgZTVfcyA9IDg5NjkyNzcwCQojIGU1X2UgPSA4OTY5MzAwOAojIGU2X3MgPSA4OTcxMTg3NQkKIyBlNl9lID0gODk3MTIwMTYJCiMgZTdfcyA9IDg5NzE3NjEwCQojIGU3X2UgPSA4OTcxNzc3NgkKIyBlOF9zID0gODk3MjA2NTEJCiMgZThfZSA9IDg5NzIwODc1CQojIGU5X3MgPSA4OTcyNTA0NAojIGU5X2UgPSA4OTcyNTIyOQpgYGAKYGBge3J9CmxpYnJhcnkoZ29vZ2xlc2hlZXRzKQpnc19scygpCnRwbXRfcnVkZGxlIDwtIGdzX3RpdGxlKCJUUE1UX3J1ZGRsZSIpCnRwbXRfcmVhZCA8LSBnc19yZWFkKHNzPXRwbXRfcnVkZGxlLCB3cyA9ICJydWRkbGVfdHBtdF92YXJpYW50cyIpCnRwbXRfcnVkZGxlX2RhdGEgPC0gYXMuZGF0YS5mcmFtZSh0cG10X3JlYWQpCmBgYApgYGB7cn0KI3JldmVyc2luZyBkYXRhIHRvIGZpdCB0cG10MV9kYXRhCnJldmVyIDwtIGZ1bmN0aW9uKGRmPXRwbXRfcnVkZGxlX2RhdGEpe2RmPC1kZltkaW0oZGYpWzFdOjEsXX0KdHBtdF9ydWRkbGVfZGF0YV9yZXYgPSByZXZlcih0cG10X3J1ZGRsZV9kYXRhKQoKI2NyZWF0aW5nIHZhcmlhbnQgY29sdW1uLCBlcXVpdiB0byB0cG10MV9kYXRhJ3MKdHBtdF9ydWRkbGVfZGF0YV9yZXYkdmFyaWFudCA8LSBkby5jYWxsKHBhc3RlLCBjKHRwbXRfcnVkZGxlX2RhdGFfcmV2W2MoNSwyNCw2KV0sIHNlcD0iIikpCgojbWFraW5nIGJvdGggdGFibGVzIHNtYWxsZXIKdHBtdF9lc3NlbnRpYWwgPC0gdHBtdF9ydWRkbGVfZGF0YV9yZXZbLGMoMiwzLDQsNSw2LDE3LDE5LDI0LDI3LDI4LDI5LDMwLDMxLDMyLDMzLDM0LDM1LDc2LDc3LDc4LDEzNyldCnRwbXQxX3Byb2NfZXNzIDwtIHRwbXQxX3Byb2Nfd3RbLGMoMSwyLDMsNSw2LDcsMzAsMzIsODApXQoKI21lcmdpbmcgdGFibGVzIHdpdGggdmFyaWFudCBuYW1lCnRwbXRfbWVyZ2UgPC0gbWVyZ2UodHBtdDFfcHJvY19lc3MsIHRwbXRfZXNzZW50aWFsLCBieT0idmFyaWFudCIpCgp0cG10X2NvcjEgPC0gZ2dwbG90KHRwbXRfbWVyZ2UsIGFlcyh4PXNjb3JlLCB5PWFzLm51bWVyaWMoU0lGVF9zY29yZSkpKSsgZ2VvbV9wb2ludChhbHBoYSA9IDAuMikgKyB4bGFiKCJWQU1QLXNlcSBzY29yZSIpK3lsYWIoIlNJRlQgc2NvcmUiKStnZ3RpdGxlKCIxIikKdHBtdF9jb3IxLjUgPC0gZ2dwbG90KHRwbXRfbWVyZ2UsIGFlcyh4PXNjb3JlLCB5PWFzLm51bWVyaWMoU0lGVF9jb252ZXJ0ZWRfcmFua3Njb3JlKSkpKyBnZW9tX3BvaW50KGFscGhhID0gMC4yKSArIHhsYWIoIlZBTVAtc2VxIHNjb3JlIikreWxhYigiU0lGVCBjb252ZXJ0ZWQgcmFua3Njb3JlIikrZ2d0aXRsZSgiMS41IikKdHBtdF9jb3I1IDwtIGdncGxvdCh0cG10X21lcmdlLCBhZXMoeD1zY29yZSwgeT1DQUREX3Jhd19yYW5rc2NvcmUpKSsgZ2VvbV9wb2ludChhbHBoYSA9IDAuMikgKyB4bGFiKCJWQU1QLXNlcSBzY29yZSIpK3lsYWIoIkNBREQgcmF3IHJhbmtzY29yZSIpK2dndGl0bGUoIjUiKQp0cG10X2NvcjIgPC0gZ2dwbG90KHRwbXRfbWVyZ2UsIGFlcyh4PXNjb3JlLCB5PWFzLm51bWVyaWMoUG9seXBoZW4yX0hESVZfc2NvcmUpKSkrIGdlb21fcG9pbnQoYWxwaGEgPSAwLjIpICsgeGxhYigiVkFNUC1zZXEgc2NvcmUiKSt5bGFiKCJQb2x5cGhlbjIgSERJViBzY29yZSIpK2dndGl0bGUoIjIiKQp0cG10X2NvcjMgPC0gZ2dwbG90KHRwbXRfbWVyZ2UsIGFlcyh4PXNjb3JlLCB5PWFzLm51bWVyaWMoUG9seXBoZW4yX0hWQVJfc2NvcmUpKSkrIGdlb21fcG9pbnQoYWxwaGEgPSAwLjIpICsgeGxhYigiVkFNUC1zZXEgc2NvcmUiKSt5bGFiKCJQb2x5cGhlbjIgSFZBUiBzY29yZSIpK2dndGl0bGUoIjMiKQp0cG10X2NvcjIuNSA8LSBnZ3Bsb3QodHBtdF9tZXJnZSwgYWVzKHg9c2NvcmUsIHk9YXMubnVtZXJpYyhQb2x5cGhlbjJfSERJVl9yYW5rc2NvcmUpKSkrIGdlb21fcG9pbnQoYWxwaGEgPSAwLjIpICsgeGxhYigiVkFNUC1zZXEgc2NvcmUiKSt5bGFiKCJQb2x5cGhlbjIgSERJViByYW5rc2NvcmUiKStnZ3RpdGxlKCIyLjUiKQp0cG10X2NvcjMuNSA8LSBnZ3Bsb3QodHBtdF9tZXJnZSwgYWVzKHg9c2NvcmUsIHk9YXMubnVtZXJpYyhQb2x5cGhlbjJfSFZBUl9yYW5rc2NvcmUpKSkrIGdlb21fcG9pbnQoYWxwaGEgPSAwLjIpICsgeGxhYigiVkFNUC1zZXEgc2NvcmUiKSt5bGFiKCJQb2x5cGhlbjIgSFZBUiByYW5rc2NvcmUiKStnZ3RpdGxlKCIzLjUiKQoKI0NBRERfcGhyZWQgbm90IHdvcnRoCgojcGxvdCh0cG10X2NvcjUpCiNwbG90KHRwbXRfY29yMSkKI3Bsb3QodHBtdF9jb3IxLjUpCnBsb3QodHBtdF9jb3IyKQpwbG90KHRwbXRfY29yMykKcGxvdCh0cG10X2NvcjIuNSkKcGxvdCh0cG10X2NvcjMuNSkKYGBgCmBgYHtyfQpUUE1UX2FidW5fQ0FERCA8LSBnZ3Bsb3QodHBtdF9tZXJnZSwgYWVzKHg9YWJ1bmRhbmNlX2NsYXNzLCB5PUNBRERfcmF3X3JhbmtzY29yZSkpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXMgPSBjKCAwLjUpKSt5bGFiKCJDQUREIHJhdyByYW5rc2NvcmUiKSt4bGFiKCJBYnVuZGFuY2UgQ2xhc3MiKQpwbG90KFRQTVRfYWJ1bl9DQUREKQoKVFBNVF9hYnVuX1NJRlRfY29udiA8LSBnZ3Bsb3QodHBtdF9tZXJnZSwgYWVzKHg9YWJ1bmRhbmNlX2NsYXNzLCB5PWFzLm51bWVyaWMoU0lGVF9jb252ZXJ0ZWRfcmFua3Njb3JlKSkpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXMgPSBjKDAuNSkpK3lsYWIoIlNJRlQgY29udiByYW5rc2NvcmUiKSt4bGFiKCJBYnVuZGFuY2UgQ2xhc3MiKQpwbG90KFRQTVRfYWJ1bl9TSUZUX2NvbnYpCgpUUE1UX2FidW5fUE9MWSA8LSBnZ3Bsb3QodHBtdF9tZXJnZSwgYWVzKHg9YWJ1bmRhbmNlX2NsYXNzLCB5PWFzLm51bWVyaWMoUG9seXBoZW4yX0hESVZfcmFua3Njb3JlKSkpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXMgPSBjKCAwLjUpKSt5bGFiKCJQb2x5cGhlbjIgSERJViByYW5rc2NvcmUiKSt4bGFiKCJBYnVuZGFuY2UgQ2xhc3MiKQpwbG90KFRQTVRfYWJ1bl9QT0xZKQoKVFBNVF9hYnVuX1BPTFkxIDwtIGdncGxvdCh0cG10X21lcmdlLCBhZXMoeD1hYnVuZGFuY2VfY2xhc3MsIHk9YXMubnVtZXJpYyhQb2x5cGhlbjJfSFZBUl9yYW5rc2NvcmUpKSkgKyBnZW9tX3Zpb2xpbihkcmF3X3F1YW50aWxlcyA9IGMoIDAuNSkpK3lsYWIoIlBvbHlwaGVuMiBIVkFSIHJhbmtzY29yZSIpK3hsYWIoIkFidW5kYW5jZSBDbGFzcyIpCnBsb3QoVFBNVF9hYnVuX1BPTFkxKQpgYGAKYGBge3J9CmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoZHBseXIpCgpQcmVkX2FidW5fU0lGVCA8LSBnZ3Bsb3QodHBtdF9tZXJnZSwgYWVzKGFidW5kYW5jZV9jbGFzcykpICsgZ2VvbV9iYXIoYWVzKGZpbGwgPSBTSUZUX3ByZWQpKSArIGdndGl0bGUoIkFidW5kYW5jZSBjbGFzcyB2cyBTSUZUIHByZWRpY3Rpb24gb2YgRGFtYWdpbmcgb3IgVG9sZXJhdGVkIikKcGxvdChQcmVkX2FidW5fU0lGVCkKCnRyaWFsX3NlcCA8LSB0cG10X21lcmdlW2MoMjEsMjMsMjQsMjYpXQp0cG10X21lcmdlX2V4cGFuZCA8LSBzZXBhcmF0ZV9yb3dzKHRwbXRfbWVyZ2UsIGMoIlBvbHlwaGVuMl9IRElWX3Njb3JlIiwgIlBvbHlwaGVuMl9IRElWX3ByZWQiLCAiUG9seXBoZW4yX0hWQVJfc2NvcmUiLCAiUG9seXBoZW4yX0hWQVJfcHJlZCIpKQoKUHJlZF9hYnVuX0hWQVIgPC0gZ2dwbG90KHRwbXRfbWVyZ2VfZXhwYW5kLCBhZXMoYWJ1bmRhbmNlX2NsYXNzKSkgKyBnZW9tX2JhcihhZXMoZmlsbCA9IFBvbHlwaGVuMl9IVkFSX3ByZWQpKSArIGdndGl0bGUoIkFidW5kYW5jZSBjbGFzcyB2cyBQb2x5cGhlbjIgSFZBUiBwcmVkaWN0aW9ucyIpICsgbGFicyhzdWJ0aXRsZSA9ICJEOiBQcm9iYWJseSBEYW1hZ2luZywgUDogUG9zc2libHkgRGFtYWdpbmcsIEI6IEJlbmlnbiIpCnBsb3QoUHJlZF9hYnVuX0hWQVIpCgpgYGAKCgoK